LoginSignup
6
1

More than 1 year has passed since last update.

何も知識がない状態でWindows11にKotlinの開発環境構築しHelloWorldした

Posted at

この記事は、Lancers(ランサーズ) Advent Calendar 2022 の7日目の記事です。

昨日投稿された @wadakatu さんのLaravelに関する記事もぜひ読んでみてください!

なぜやるのか

  • 折角のAdvent Calendarなので今までやったことがないことをやりたい
  • 新しいチャレンジは自分にとっても新しい刺激になるはず
  • Kotlinを選んだ理由はIntelliJ IDEAを使ってみたかったから
  • 将来的にはDart/Flutterあたりも触っていきたい
  • Kotlinをサーバーサイド言語として選定しているケースをチラホラ見たこと

何となく知っていること

  • KotlinはJetBrains社により、Javaを改良され作られた静的型付けのオブジェクト指向プログラミング言語であること
  • Kotlin開発はIntelliJ IDEAを使っておけば問題なさそうなこと

正直言って殆ど事前情報はないです。

本日のゴール

  • KotlinでHello Worldを出力するまで

環境を用意する

とりあえずJetBrains社がマニュアルか何かを用意しているはずなので見つけてきたので軽く確認します。

インストール

  1. https://www.jetbrains.com/ja-jp/toolbox-app/ から「JetBrains Toolbox App」をインストールする
    image.png
    インストールはすぐ完了した。そのまま完了する。
    image.png
    続行する。
    image.png
    ライセンス契約に同意する。
    image.png
    ダークにした。「はじめる」を押す。
    image.png
    今回は「IntelliJ IDEA Community」をインストールする。

  2. IntelliJ IDEA のインストールとセットアップ
    インストールボタンを押す。
    image.png
    image.png
    インストールできたので起動する。
    image.png
    同意して続ける。
    image.png
    IntelliJ IDEA の使用状況の統計を JetBrains と共有するか選択する
    image.png
    立ち上げ中
    image.png
    起動ページが立ち上がる

IntelliJ IDEA でプロジェクトを開始する

参考

https://pleiades.io/help/idea/create-your-first-kotlin-app.html#create-project
今回は「新規プロジェクト」を選択。

image.png

初期画面はこのようになっているので、諸々入力する。

項目名
名前 HelloWorld
場所 ~\IdeaProjects
Git リポジトリの作成 チェックあり
言語 Kotlin
ビルドシステム Gradle
JDK Oracle OpenJDK version 18.0.1
サンプルコードの追加 チェックあり

image.png

こちらで作成する。

image.png

IDEが起動した。

事前作成済み共有インデックスのダウンロードとは?
共有プロジェクトインデックス(英語)プラグインは、IntelliJ IDEA コミュニティで 30 日間利用できます。プラグインを引き続き使用する場合は、IntelliJ IDEA コミュニティで IntelliJ IDEA Ultimate、Android Studio、GoLand、PhpStorm、PyCharm、RubyMine、または WebStorm のライセンスをアクティブ化できます。
https://pleiades.io/help/idea/shared-indexes.html

コミュニティエディションなので今回はダウンロードしない。

image.png

今日のヒントが表示された。
次へを押すと結構な量のヒントが表示される。時間がある時に「学習の開始」より対話型レッスンが使用できる。
いくつか今日のヒントを紹介する。

image.png
image.png
image.png
image.png
image.png

プロジェクトの構成

image.png

今回扱うファイルはこちら。

/src/main/kotlin/main.kt
fun main(args: Array<String>) {
    println("Hello World!")

    // Try adding program arguments via Run/Debug configuration.
    // Learn more about running applications: https://www.jetbrains.com/help/idea/running-applications.html.
-   println("Program arguments: ${args.joinToString()}")
}

既にHelloWorldを出力されるようにできていたので実行してみる。
※Program argumentsの箇所は不要なので削除する

参考

コードの実行はCtrl + Shift + F10を押す。

image.png

プログラムが開始すると、実行ツールウィンドウが開き、「Hello World!」が出力される。

ここまでの感想

  • インストールはめっちゃ簡単
  • PhpStormは使ったことがあるが、IntelliJ IDEAは初めてなもののすぐUIや操作に馴染めそう
  • Gradleってなんだろう

Gradleとは
GradleはApache AntやApache Mavenのコンセプトに基づくオープンソースビルド自動化システムであり、プロジェクト設定の宣言にはApache Mavenが利用するXML形式ではなくGroovyベース、もしくはKotlin Scriptベースのドメイン固有言語 (DSL) を採用している[2]。Gradleはタスクの起動順序の決定に有向非巡回グラフ(英: Directed Acyclic Graph、DAG)を利用する。 https://ja.wikipedia.org/wiki/Gradle

Gradle公式より

Gradle は、柔軟性とパフォーマンスに重点を置いたオープンソースのビルド自動化ツールです。Gradle ビルド スクリプトは、GroovyまたはKotlin DSL を使用して記述されます。Gradle の機能について読んで、Gradleで何ができるかを学んでください。

  • 高度にカスタマイズ可能— Gradle は、最も基本的な方法でカスタマイズ可能で拡張可能な方法でモデル化されています。
  • 高速— Gradle は、以前の実行からの出力を再利用し、変更された入力のみを処理し、タスクを並行して実行することにより、タスクを迅速に完了します。
  • 強力— Gradle は Android の公式ビルド ツールであり、多くの一般的な言語とテクノロジをサポートしています。

パッケージ化してみる

現状の知識

  • Javaではアプリケーションをビルドするとjarファイルが出力された気がする

参考

タスク定義を追加する。

build.gradle.kts
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.7.20"
    application
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
}

dependencies {
    testImplementation(kotlin("test"))
}

tasks.test {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

+ tasks.jar {
+     manifest {
+         attributes["Main-Class"] = "MainKt"
+     }
+     configurations["compileClasspath"].forEach { file: File ->
+         from(zipTree(file.absoluteFile))
+     }
+     duplicatesStrategy = DuplicatesStrategy.INCLUDE
+ }

application {
    mainClass.set("MainKt")
}

ビルドスクリプトを編集し、タスク定義を追加した。
正直、このタスク定義がどのような動作をするかについてはGradleについての知見も必要そうだったので後回しにする。

続いてGradleよりjarタスクを実行する。

image.png

0:01:12:  'jar' を実行中...

> Task :wrapper

BUILD SUCCESSFUL in 134ms
1 actionable task: 1 executed
> Task :compileKotlin UP-TO-DATE
> Task :compileJava NO-SOURCE
> Task :processResources NO-SOURCE
> Task :classes UP-TO-DATE
> Task :jar UP-TO-DATE
> Task :inspectClassesForKotlinIC UP-TO-DATE

BUILD SUCCESSFUL in 117ms
3 actionable tasks: 3 up-to-date
0:01:13:  'jar' の実行を完了しました。

結果の JAR は build/libs ディレクトリに表示されます。
結果の JAR は out/artifacts ディレクトリに表示されます

アーティファクトとは
アーティファクトは、ソフトウェアソリューションまたはその一部をテスト、デプロイ、または配布するためにまとめたプロジェクトアセットのアセンブリです。例としては、コンパイルされた Java クラスのコレクションまたは Java アーカイブにパッケージ化された Java アプリケーション、ディレクトリ構造としての Web アプリケーション、または Web アプリケーションアーカイブなどがあります。 https://pleiades.io/help/idea/working-with-artifacts.html

Ctrl + Alt + Shift + Sよりプロジェクトの構造を開けばアーティファクトの設定は可能だが、
現時点ではどのような使い道かまでは分からないため設定は保留にする。

image.png

調べていくと「ビルドアーティファクト」という言葉を見つけた。

ビルドアーティファクトとは
ビルドアーティファクトは、ビルドによって生成されたファイルです。通常、これらにはディストリビューションパッケージ、WAR ファイル、レポート、ログファイルなどが含まれます。ビルド構成を作成するときは、一般設定を構成するページでビルドのアーティファクトへのパスを指定します。 https://pleiades.io/help/teamcity/build-artifact.html

まだ理解不足だが

  • アーティファクトはビルドの結果として生成されるものを指している
  • 配布用する場合などにはアーティファクトのビルドより生成されたJARファイルを配布する (SNAPSHOTではない)

今のところの理解ではこの認識で問題なさそう。

JARを実行する

ターミナルからJavaのバージョンを確認する

k@DESKTOP-0P1R3H5 MINGW64 ~/IdeaProjects/HelloWorld (master)
$ java --version
java 18.0.1.1 2022-04-22
Java(TM) SE Runtime Environment (build 18.0.1.1+2-6)
Java HotSpot(TM) 64-Bit Server VM (build 18.0.1.1+2-6, mixed mode, sharing)

JARを実行する

k@DESKTOP-0P1R3H5 MINGW64 ~/IdeaProjects/HelloWorld (master)
$ java -jar ./build/libs/HelloWorld-1.0-SNAPSHOT.jar
Hello World!

アーティファクトをビルドしJARを実行してみる

アーティファクト設定は以下の通りにした (Ctrl + Alt + Shift + S)
image.png

マニフェスト作成する必要がある
image.png
image.png

そのままOKする

アーティファクトをビルドする
image.png
image.png
image.png

アーティファクトが生成された。実行してみる。

k@DESKTOP-0P1R3H5 MINGW64 ~/IdeaProjects/HelloWorld (master)
$ java -jar ./out/artifacts/HelloWorld/HelloWorld.jar 
./out/artifacts/HelloWorld/HelloWorld.jarにメイン・マニフェスト属性がありません

どうやらメインクラス名も必要だった
image.png

メインクラスに「MainKt」を追加した。

META-INF/MANIFEST.MF
Manifest-Version: 1.0
Main-Class: MainKt

※メインクラスが追加されている

再度アーティファクトをビルドし実行

k@DESKTOP-0P1R3H5 MINGW64 ~/IdeaProjects/HelloWorld (master)
$ java -jar ./out/artifacts/HelloWorld/HelloWorld.jar 
エラー: メイン・クラスMainKtを検出およびロードできませんでした
原因: java.lang.ClassNotFoundException: MainKt

・・・と思ったが設定を色々間違えていたみたい

image.png

参考

k@DESKTOP-0P1R3H5 MINGW64 ~/IdeaProjects/HelloWorld (master)
$ java -jar ./out/artifacts/HelloWorld_main_jar/HelloWorld.main.jar 
Hello World!

無事にアーティファクトでも実行することができた。

感想

  • Javaのクラスパス等の情報はやはりJavaということもあってか、情報はたくさん出てくる
  • Kotlinのチュートリアルは初見には少し優しくないかも… (アーティファクトの設定の記載はない、など)
  • まだ簡単なアプリケーションしか作っていないのでKotlin入門を引き続き漁っていきたいと思います。
  • Windowsだからといって躓いたポイントなどはなかった
  • コミュニティエディションは「Spring Boot」はサポートされていないので本格的にやるならUltimateは欲しい。
  • タイトルに開発環境構築と謳ったが、IDEをインストールしただけなので誇張と言っても過言ではないくらい環境構築は楽だった。

その他

調べながらではありますがガチの初見で環境構築しているため、やり方が間違ってる可能性もあります。
こうしたほうが良い・すべきなどありましたら是非ご教示ください!

明日は@shirasudさんの記事です。お楽しみに!

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1