目次

Kotlin

JVMで実行可能なプログラムを開発できる言語。

Android開発に使われるが、簡潔に書けるためJavaの代替としても人気のようだ。

何より言語開発元があのJetBrainsなので、当社が無料で公開しているIDEであるIntelliJ IDEA(Community Edition)の全面サポートが受けられる。JetBrainsはいいぞ。

試しに触ってみた備忘録程度なので、あまり網羅的な記事にはなっていない。

環境

インストール

まず最初にやりたいことがまとめられていて有難い。

コンパイラや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通りが見つかった。ただ、いずれも多少は手間が発生するので、大きいプロジェクトになった時に考えればいいか。