GradleでコンパイルするJavaのバージョンを指定するときはJavaVersion列挙型が使える

小ネタ。

GradleでJavaコンパイルするバージョンなどを指定する際、お決まりで

apply plugin: 'java'

sourceCompatibility = 1.8
targetCompatibility = '1.8'

のように記述するが、ここに列挙型が使える。

ただ、毎回クラス名が何だったか忘れるのでメモ。

sourceCompatibility などの仕様と JavaVersion 列挙型

JavaPluginExtensionsourceCompatibilitytargetCompatibility をみると、型が JavaVersion になっている。

よくある記述例のように、数値や文字列を設定すると、 JavaVersion#toVersion(Object) メソッドで、JavaVersionに変換されている模様。

JavaVersion は別途importなどせずに使用可能。また、 targetCompatibility のデフォルトは sourceCompatibility なので、通常省略できる。

apply plugin: 'java'

sourceCompatibility = JavaVersion.VERSION_1_8
// targetCompatibility = JavaVersion.VERSION_1_8

Gradleのバージョンで利用可能なJavaのバージョンが列挙型の値として宣言されているため、JavaVersionを使えば記述ミスなどが起こらないのがメリットか。

枯れたバージョンならともかく、常にGradleが対応する最新のJavaを使って動作検証などしたい場合には、 JavaVersion.VERSION_HIGHER も使える。

ただ、新しいバージョンのJavaの動作検証をしたい場合、Gradle v6.7 以降の Toolchain を使うほうが無難だと思うので、需要はなさそうだが。

なお、 Toolchain を使うときの、ビルド用Javaバージョン指定には、 JavaLanguageVersion を使う。こちらはインターフェースで、ファクトリーメソッド JavaLanguageVersion#of(int) または JavaLanguageVersion#of(String)インスタンスを生成する模様。

java {
  toolchain {
    languageVersion = JavaLanguageVersion.of(14)
  }
}

振り返り

初期設定で書いたら終わりなので、毎回「クラス名なんだっけ、う~ん」となっては過去につくったプロジェクトを見て設定、をやり続けているので、いい加減アウトプットしてみる。

JavaVersion に JavaLanguageVersion 実装しておいてくれれば、Gradleの実行とToolchainでのビルドに使用するJavaのバージョンを簡単に合わせられるんだけどなぁ。