JVMターゲット互換性エラーの解決
問題の説明
AndroidプロジェクトでGradleビルドを実行すると、以下のようなエラーが発生することがあります:
ERROR: '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.
このエラーは、JavaコンパイルタスクとKotlinコンパイルタスクのJVMターゲットバージョンが一致していないことを示しています。Android StudioのバージョンアップやGradleのアップデート後に発生することが多い問題です。
解決策
1. 基本的な設定方法
Androidモジュールのbuild.gradle.kts
ファイルで、以下のようにcompileOptions
とkotlinOptions
を同じバージョンに設定します:
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
}
重要
エラーメッセージに表示されているバージョン番号を確認してください。エラーが「17」を示している場合は、VERSION_11
の代わりにVERSION_17
を使用する必要があります。
2. 非Androidモジュールの場合
Java/Kotlinライブラリモジュールなど、Androidプラグインを使用していないモジュールでは、以下のように設定します:
plugins {
`java-library`
kotlin("jvm")
}
java {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions {
jvmTarget = "11"
}
}
3. 最新の推奨方法 (Kotlin 1.8+)
Kotlin 1.8以降では、jvmToolchain
を使用する方法が推奨されています:
kotlin {
jvmToolchain(11)
}
この方法は、JavaコンパイルとKotlinコンパイルの両方のターゲットバージョンを一度に設定します。
モジュール間の整合性
マルチモジュールプロジェクトでは、すべてのモジュールで同じJVMターゲットバージョンを使用する必要があります。メインプロジェクトと各モジュールのbuild.gradle.kts
ファイルで設定が一致していることを確認してください。
注意
モジュールによって異なるバージョンが設定されていると、ビルドエラーが発生する可能性があります。
kaptを使用している場合の特別な対応
kapt (Kotlin Annotation Processing Tool) を使用している場合、追加の設定が必要になることがあります:
import org.jetbrains.kotlin.gradle.tasks.KaptGenerateStubs
tasks.withType<KaptGenerateStubs> {
kotlinOptions {
jvmTarget = "11"
}
}
トラブルシューティング
バージョン番号の表記について
Javaバージョンの表記方法に注意してください:
// 正しい表記
JavaVersion.VERSION_11 // Java 11
JavaVersion.VERSION_17 // Java 17
// 間違った表記(意味が異なります)
JavaVersion.VERSION_1_9 // Java 9(非推奨)
Gradleのバージョン互換性
GradleとJavaのバージョン互換性に問題がある場合、以下のような対応が必要です:
- 使用しているGradleバージョンに適したJavaバージョンを選択する
- 必要に応じてGradleバージョンをダウングレードする
GradleとJavaのバージョン互換性表
Gradleバージョン | 対応するJavaバージョン |
---|---|
8.0+ | 17+ |
7.0-7.5 | 11-17 |
6.0-6.9 | 8-14 |
警告を無効にする方法(非推奨)
どうしても解決できない場合、一時的な対策として警告を無効にすることができます:
# gradle.properties
kotlin.jvm.target.validation.mode = IGNORE
注意
これは根本的な解決ではなく、あくまで一時的な回避策です。可能な限り正しいバージョン設定を行うことをお勧めします。
まとめ
JVMターゲット互換性エラーを解決するには:
- エラーメッセージで表示されている実際のバージョンを確認する
- すべてのモジュールで
compileOptions
とkotlinOptions
を同じバージョンに設定する - 可能であれば最新の
jvmToolchain
メソッドを使用する - マルチモジュールプロジェクトでは全モジュールの設定を確認する
- kaptを使用している場合は追加の設定が必要な場合がある
これらの手順に従うことで、JVMターゲットの互換性エラーを解決し、安定したビルド環境を構築できます。