Gradle+KotlinでのJavaのtarget versionの指定のしかたをまとめた
software | version |
---|---|
gradle | 7.2 |
Kotlin | 1.5.30 |
Gradle+ Kotlinの環境でライブラリを書いていたらいつの間にか以下のようなwarningが出るようになってしまいました。
% ./gradlew test > Task :compileKotlin 'compileJava' task (current target is 11) and 'compileKotlin' task (current target is 1.8) jvm target compatibility should be set to the same Java version. > Task :compileTestKotlin 'compileTestJava' task (current target is 11) and 'compileTestKotlin' task (current target is 1.8) jvm target compatibility should be set to the same Java version.
TL;DR
Gradleに以下の設定を入れる。以下はJava8の場合で KotlinDSLを使う場合の例
java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } // こちらの書き方でもOK // java { // toolchain.languageVersion.set(JavaLanguageVersion.of(8)) // } val compileKotlin: KotlinCompile by tasks compileKotlin.kotlinOptions.jvmTarget = "1.8" // javaの方とversionをあわせる
ググってみた
どうもJavaのtarget versionとKotlinでのjvmTargetの値を両方指定しないといけないらしい。
toolchainの話が出てきたので調べてみたところどうもGradle 6.7から追加された概念らしい(後でもうちょい調べてみよう)
Gradle 6.7 で追加された Toolchain サポート - A Memorandum
Gradleはjava_homeで指定されているバージョンを使おうとするので私はadoptopenjdk11を使っていることもありtarget versionの互換性が〜〜〜というエラーが出るようになった様子。
というわけでこういう書き方をするようにbuild.gradle.ktsを書き直したところビルド時にwarningが出なくなりました。
java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } // こちらの書き方でもOK // java { // toolchain.languageVersion.set(JavaLanguageVersion.of(8)) // } val compileKotlin: KotlinCompile by tasks compileKotlin.kotlinOptions.jvmTarget = "1.8" // javaの方とversionをあわせる
余談
ちなみに 私はm1 macを使っているせいか toolchain.languageVersion.set(JavaLanguageVersion.of(8))
と書くと
adoptOpenJDKから aarch64版のopenjdk8をダウンロードしてくれようとするのですが、adoptopendjdkでは提供していないため
ビルドしようとするとエラーになってしまうので toolchainを使っていません