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をあわせる
ググってみた
stackoverflow.com
どうも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を使っていません