Kotlin JVMターゲットの非互換エラーの解決法
// 基本設定例 (appレベルのbuild.gradle.kts)
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
問題の概要
Android StudioでGradleの同期またはビルド時に以下のエラーが発生する場合:
Execution failed for task ':buildSrc:compileKotlin'.
Inconsistent JVM-target compatibility detected for tasks 'compileJava' (21) and 'compileKotlin' (1.8).
このエラーは、プロジェクト内でJavaコンパイルタスクとKotlinコンパイルタスクのJVMターゲットバージョンが不一致であることを示しています。具体的には:
compileJava
タスクがJVM 21をターゲットcompileKotlin
タスクがJVM 1.8をターゲット
マルチモジュールプロジェクトでは、メインモジュールとbuildSrc
モジュール間で設定が競合する場合が頻発します。
根本的な原因
JavaとKotlinコンパイラのターゲット設定不一致が主原因です:
- JDKアップデートでデフォルト設定が変更されたが、Kotlin設定が追従していない
- モジュール/サブプロジェクト毎に異なるバージョン指定が存在
- KotlinプラグインとJavaバージョンの互換性の問題
注意: JDK 17以降では、
1.8
のような旧形式の指定は非推奨です。数値のみ(例:17
)を使用してください。
効果的な解決方法
方法1: アプリケーションレベルの設定統一(推奨)
app/build.gradle.kts
にJava/Kotlinの互換設定を追加:
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17" // "11", "21" 等プロジェクトに適したバージョン
}
}
方法2: buildSrcモジュールの設定修正
buildSrc/build.gradle.kts
がある場合、専用の設定が必要:
plugins {
`kotlin-dsl`
}
kotlin {
jvmToolchain(21) // メインプロジェクトと一貫したバージョン
}
方法3: Gradle JDK設定の変更
Android Studioの設定からプロジェクト全体のJDKバージョンを統一:
- File > Settings (Ctrl+Alt+S)
- Build, Execution, Deployment > Build Tools > Gradle
- Gradle JDKで適切なバージョンを選択
方法4: KotlinバージョンとJDKの互換性確保
KotlinとJDKの互換性問題が原因の場合は:
- プロジェクトレベルの
build.gradle.kts
を開く - Kotlinバージョンを最新に更新(例:1.9.24)kotlin
plugins { kotlin("jvm") version "1.9.24" // {x} 部分を最新バージョンに }
方法5: マルチモジュール環境での個別設定
特定モジュールのみに問題がある場合:
- エラーログで問題モジュールを特定(例:
:expo-modules-core$android-annotation
) - 該当モジュールの
build.gradle.kts
を開く - 個別にjvmTargetを設定:kotlin
kotlin { compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) } }
ビルドキャッシュの問題
.gradle
と.idea
ディレクトリを削除後、File > Sync Project with Gradle Filesを実行すると問題解決する場合があります:
rm -rf .gradle
rm -rf .idea
ベストプラクティスとバージョン選択ガイド
JDKバージョン選定基準
プロジェクトタイプ | 推奨バージョン | 補足 |
---|---|---|
新規プロジェクト | JDK 21 | LTS版で長期サポート対象 |
既存Androidプロジェクト | JDK 17 | Android互換性バランス最適 |
レガシーシステム | JDK 11 | 旧環境対応が必要な場合のみ |
Kotlinコンパイラオプションの新記法
Kotlin 1.5以降ではjvmToolchain
利用が簡潔:
// 従来記法(廃止予定)
kotlinOptions { jvmTarget = "11" }
// 現代的な記法(推奨)
kotlin { jvmToolchain(11) }
バージョン確認コマンド
ターミナルで以下を実行し、全モジュールの設定を一括確認:
./gradlew -q properties | grep jvmTarget
出力例:
jvmTarget: 17
:buildSrc jvmTarget: 11
不一致があるモジュールが特定可能
結論
「JVM-target compatibility detected」エラーは、全モジュールでのJVMターゲット設定の一貫性確保で確実に解決できます。特に:
主要設定箇所3つを確認:
- アプリケーションレベル(
app/build.gradle.kts
) - プロジェクトレベル(
build.gradle.kts
) - buildSrcモジュール(
buildSrc/build.gradle.kts
)
- アプリケーションレベル(
最新ツールチェーンの採用:
- JDK 17/21 + Kotlin 1.9+の組み合わせ
jvmToolchain()
の積極利用
マルチモジュール環境での集中管理:
- バージョン変数を共通化(例:
extra["jvmVersion"] = 17
) - サブプロジェクト設定の継承を活用
- バージョン変数を共通化(例:
Kotlin/Java混在プロジェクトでは、定期的なjvmTarget
設定の監査を推奨します。