Kotlin
JVMで実行可能なプログラムを開発できる言語。
Android開発に使われるが、簡潔に書けるためJavaの代替としても人気のようだ。
何より言語開発元があのJetBrainsなので、当社が無料で公開しているIDEであるIntelliJ IDEA(Community Edition)の全面サポートが受けられる。JetBrainsはいいぞ。
試しに触ってみた備忘録程度なので、あまり網羅的な記事にはなっていない。
環境
- Windows
インストール
まず最初にやりたいことがまとめられていて有難い。
- (JDK インストール)
- IntelliJ IDEA インストール
- (Gradle インストール)
- プロジェクト作成
- build.gradle いじる
コンパイラやGradle(ビルドツール)は、IntelliJ IDEA に全部入ってるので楽ちん。個別のインストールは必要ない。
JDKは必要になるので、まだの場合はインストール。その際、下記の問題があるので、少し古くて問題なければJava8をインストールしておくと面倒が無い。
2018/07時点ではIntelliJ IDEAに梱包されているGradleのバージョンがやや古く、対応してるJVMが1.8までのため、Java9や10を使う設定にしている環境では新規プロジェクト作成時に Gradle Wrapper の生成に失敗する。
Could not determine Java version using executable C:\Program Files\Java\jdk-10.0.1\bin\java.exe.
(Gradle Wrapperは、GradleをインストールしていないPCでもプロジェクト内でGradleを使えるように自動で環境を作る仕組み。参考: インストールレスで Gradle してみる - bluepapa32’s Java Blog)
上記のエラーが出ても、Gradleにwrapperが使えなくなるだけで、プロジェクトは作成されるし、Gradleがローカルにインストールされていれば自動的にそちらを使うように設定される。
それでもwrapperを使いたいという場合は、残念ながら、一度Gradleをインストールして、コマンドラインから gradle wrapper
してやらないといけないっぽい。
このコマンドにより、gradle
フォルダと gradlew, gradlew.bat
ファイルが生成される。これがwrapperの実行ファイルである。
プロジェクトルートにこれら3ファイルがある状態で、Settings→[Build, Execution, Deployment]→[Build Tools]→[Gradle]で、中央付近のラジオボタンから「Use default gradle wrapper (recommended)」を選択しなおすと、wrapperが使われるようになる。(wrapperを使う意味も薄くなるが)
これらを一度作ってしまえば、次に作成するプロジェクトからは使い回せる。IntelliJで新規プロジェクトを作成する前にプロジェクトフォルダだけ用意し、3ファイルを放り込んでおくとよい。
build.gradle
ライブラリ管理
使いたいJavaまたはKotlinのライブラリがあったら、dependencies
に記述すると勝手にダウンロードして使えるようにしてくれる。反映されない場合は右の「Gradle」パネルから「Refresh Gradle Project」してみる。
IntelliJで作成したプロジェクトでは、最初は「repositories」には「mavenCentral」のみ設定されている。もし他のリポジトリでしか配布されていない物があれば、追加する。
実行jar作成
実行jarを作成するためには、どれがメインクラスかを指定する必要がある。以下を追記する。
jar { manifest { attributes 'Main-Class': 'main()を含むクラス名' } from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } }
from
の部分はよくわかっていないが、指定しないと「java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics」みたいに、依存ライブラリのクラスが見つからないエラーが出る。詳細な理由は以下参照。
ここまで設定して、IntelliJのGradleパネルからプロジェクトの[Tasks]→[build]→[jar]をダブルクリックで実行することで、「build/libs/
」に.jarが生成される。
実行jar作成(advanced)
上記の方法で.jarを作成すると、ライブラリまでが1つにまとめられた状態になるので配布には都合がいいのだが、ある問題が残る。
.jarの実体はZipファイルなので解凍すれば中身が見られるのだが、そこにはライブラリの.jarも含め全てのファイルが解凍された状態で入っていて、少しライブラリが巨大になると実行時に(解凍するので)いちいち時間がかかるようなファイルになるらしい。また(パッケージさえちゃんと命名してれば可能性は低いが)同名ファイルが競合する危険性もある。
解消する方法は以下の2通りが見つかった。ただ、いずれも多少は手間が発生するので、大きいプロジェクトになった時に考えればいいか。
- .jar外部にライブラリを出し、.jarにそのクラスパスを覚えさせる(実行にはライブラリも併せて必要)
- SpringBootプラグインで、.jar内部に、ライブラリは.jarのまま格納する