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

この記事は、[Lancers（ランサーズ） Advent Calendar 2022](https://qiita.com/advent-calendar/2022/lancers) の7日目の記事です。

https://qiita.com/advent-calendar/2022/lancers

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

https://qiita.com/wadakatu/items/c0c9dd138a3f53c63191

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

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

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

## 本日のゴール
- KotlinでHello Worldを出力するまで

## 環境を用意する

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

https://pleiades.io/help/idea/getting-started.html

### インストール
1. https://www.jetbrains.com/ja-jp/toolbox-app/ から「JetBrains Toolbox App」をインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/4f92ffcc-001e-55db-3faf-de8f55247293.png)
インストールはすぐ完了した。そのまま完了する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/59d66ac1-434e-d8b9-ad5b-982bcd063773.png)
続行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/04b63256-ba46-c81a-19fb-76360d3fe642.png)
ライセンス契約に同意する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/40dc47ad-68a7-c640-fa2d-25b52f97d630.png)
ダークにした。「はじめる」を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/44fbc553-31bf-ec9f-0a8d-3c29d2ace1b3.png)
今回は「IntelliJ IDEA Community」をインストールする。

2. IntelliJ IDEA のインストールとセットアップ﻿
インストールボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/7267fdbb-2d4d-f785-53d4-49b9a0d9953b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/470e6853-e93f-9ea9-e943-0a3fcc4df312.png)
インストールできたので起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/ba0745df-4bcf-c649-07ea-337b45a65c8d.png)
同意して続ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/b8758ee1-70a1-ec7e-f646-1d3158e360d1.png)
IntelliJ IDEA の使用状況の統計を JetBrains と共有するか選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/2dd8f5f0-5693-bcac-0fc0-96def4fd43e1.png)
立ち上げ中
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/4bb32e32-51d7-972d-3eb6-0c35a708db76.png)
起動ページが立ち上がる

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/1c8e5299-7315-a19f-99c9-5e0ebd03b637.png)

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


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/d9a8f1c3-8c56-7f73-9268-17728e2a2a43.png)


こちらで作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/745a241b-3adf-0f7e-18da-71882c243962.png)

IDEが起動した。

:::note info
事前作成済み共有インデックスのダウンロードとは？
共有プロジェクトインデックス(英語)プラグインは、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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/ccd7d5f6-3ed2-2e8f-527b-f0fbbeda0782.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/09550b0e-22ef-9e1a-f713-07aaec271457.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/7d3fef36-87ec-7647-0c7a-61109ebeb0b8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/73cb6207-7739-5639-0c9f-2b6b33eed09a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/e78fb6d0-b721-3827-5c02-0c79792db312.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/3dc3b16d-c9fd-4553-d998-a99c80199197.png)

### プロジェクトの構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/1d1524b9-258e-1547-17ba-7cc5c6674894.png)

今回扱うファイルはこちら。
```diff_kotlin:/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の箇所は不要なので削除する

参考

https://pleiades.io/help/idea/create-your-first-kotlin-app.html#run-code-from-idea

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/caacf761-4341-b269-2a35-8c67ed567c6a.png)

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

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

:::note info
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 の公式ビルド ツールであり、多くの一般的な言語とテクノロジをサポートしています。

https://docs.gradle.org/current/userguide/userguide.html

### パッケージ化してみる
現状の知識
- Javaではアプリケーションをビルドすると`jar`ファイルが出力された気がする

参考

https://pleiades.io/help/idea/create-your-first-kotlin-app.html#package-as-jar

タスク定義を追加する。

```diff_kotlin: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/60b65dcd-9cb0-c6e9-bb84-f98fb997cd98.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 ディレクトリに表示されます

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/2f8d9c06-d727-2d87-6cbf-102ac61df5ce.png)

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

:::note info
ビルドアーティファクトとは
ビルドアーティファクトは、ビルドによって生成されたファイルです。通常、これらにはディストリビューションパッケージ、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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/cb447d0d-4514-8fcb-1842-bfaddafbff92.png)

マニフェスト作成する必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/28363c40-9640-23cf-5e40-2c5d65340560.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/18619837-cedd-f3b3-5635-30fd59ff1f21.png)

そのままOKする


アーティファクトをビルドする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/1c2ecacc-9882-620e-68c6-b33a1ca46639.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/75b672ff-bee7-deb9-a3be-8063f266eecd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/2c3d8349-6695-0445-52f9-42e1424988e6.png)

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

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

どうやらメインクラス名も必要だった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/d763b9cb-68a4-89c2-3821-19c6de3c00e4.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290072/1ac57aab-c0e3-979b-c449-7a78712af652.png)

参考

https://tech.mamezou00000.com/entry/IntelliJ-IDEA-jar


```
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さんの記事です。お楽しみに！