Keep on moving

あんまりまとまってないことを書きますよ

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をあわせる

ググってみた

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を使っていません