Gradle: Java Toolchain に対応するための調査
文脈
kapt task で失敗する
'compile<Variant>JavaWithJavac' task (current target is 1.8) and 'kaptGenerateStubs<Variant>Kotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.
Java task と compile Kotlin task は target compatibility や target JVM の設定を参照しているようだが kapt task だけ実行環境の JVM のバージョンを参照しているらしい
Kotlin 1.8 から kapt が kotlinOption.targetJvm を参照しなくなったらしい
Java Toolchains を使って解決してくれという感じっぽい
Build script 内のいち option から割と大仰な仕組みの構築への移行をそんな軽く言われてもなあみたいな感
ついでに AGP 8.0 (というか R8) がまだ JDK 17 に対応しきれていないという情報を得た
Toolchain を使うにしても 11 あたりかなあ
8 に留めたいか?
周り見てそんな感じだから合わせてるだけというのが実際のところで、上げても問題ないなら 11 とか 17 とかにしたい
というか Robo あるから runtime は 9 以上確定なんだよな
調べてみると Gradle 的にも targetCompatibility や sourceCompatibility ではなく Java Toolchain を使ってほしそうにしている
Note that using a toolchain is preferred to using a compatibility setting for most cases.
まあやるか
Requirement
Toolechain で使う Java version は 11
17 は R8 が落ち着いてからの方が良いかも
Robolectric を使ったテストがあるので少なくとも unit test の実行時は 9 以上が必要
property で回避したくない
LTS
Build の実行環境依存を無くしたいので auto-provisioning の設定は必須
Android 向けの workaround
Java Toolchain の設定
以下を追記
code:kotlin
// Kotlin Gradle Plugin の場合
kotlin {
jvmToolchain(11)
}
// Java の方の設定でも Kotlin は参照するらしい
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(11))
}
}
kotlinOptions.jvmTarget を削除
Toolchain Download Repository の設定
code:setting.gradle.kts
plugins {
id("org.gradle.toolchains.foojay-resolver") version("0.4.0")
}
toolchainManagement {
jvm {
javaRepositories {
repository("foojay") {
resolverClass.set(org.gradle.toolchains.foojay.FoojayToolchainResolver::class.java)
}
}
}
}
// convention plugin を使うと toolchainManagement を省略できる
plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version("0.4.0")
}
Vendor の設定ができる
これをやろうとすると java extension の方が良いのだろうか?
jvmExtension { } 使えば kotlin extension でもできる
何も指定しないと Temurin が落ちてきそう
code:gradle
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(11))
vendor.set(JvmVendorSpec.<...>)
}
}
Auto-provisioning の設定をしたら github actions で setup-java の step 抜けるんじゃないか
もともと環境にあればそれを使うから setup が早い方を採用するのが良さそう
toolchain のバージョンと setup-java のバージョンを合わせる必要がある
Android 向けの workaround
AGP のバグで sourceCompatibility や targetCompatibility の値に toolchain のものが設定されないっぽい
直るまでは引き続き sourceCompatibility や targetCompatibility を書いておきましょう
KSP
同様にダメ
Execution failed for task ':app:kspDebugKotlin'.
> 'compileDebugJavaWithJavac' task (current target is 1.8) and 'kspDebugKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.