Androidビルドエラー:JavaとKotlinのJVMターゲットバージョン不一致の解決法
問題の説明
Android Studioでプロジェクトをビルドする際、以下のエラーが発生することがあります:
compileDebugJavaWithJavac task (current target is 1.8) and kaptGenerateStubsDebugKotlin task (current target is 17) jvm target compatibility should be set to the same Java version
このエラーは、プロジェクト内で使用されているJavaとKotlinのJVMターゲットバージョンが不一致であることが原因です。具体的には:
compileDebugJavaWithJavac
タスクがJava 1.8(JDK 8)をターゲットkaptGenerateStubsDebugKotlin
タスクがJava 17をターゲット
このバージョンの不一致によりビルドプロセスが失敗します。この問題はマルチモジュールプロジェクトやKotlinマルチプラットフォームプロジェクトで頻繁に発生します。
解決方法
以下に効果的な解決策をいくつか紹介します。プロジェクト構成に応じて適切な方法を選択してください。
方法1: モジュールレベルの設定変更(推奨)
最も一般的な解決方法は、app
モジュールのbuild.gradle
ファイルでJavaとKotlinのバージョンを統一することです。
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
}
Kotlinスクリプト(.kts
)を使用している場合:
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
TIP
VERSION_17
はVERSION_1_8
(Java 8)など、プロジェクトに適したバージョンに置き換えてください。すべての設定で同じバージョンを使用することが重要です。
方法2: プロジェクト全体の設定(サブプロジェクト設定)
マルチモジュールプロジェクトでは、ルートのbuild.gradle
で全モジュールに適用する設定を定義します。
// ルートのbuild.gradleに追加
subprojects {
afterEvaluate { project ->
if (project.hasProperty('android')) {
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
kotlinOptions {
jvmTarget = "17"
}
}
}
}
方法3: JVM Toolchainの使用(最新のベストプラクティス)
GradleのJVM Toolchain機能を使用すると、プロジェクト全体で使用するJDKバージョンを統一できます。
// ルートのbuild.gradleに追加
subprojects {
afterEvaluate {
kotlin {
jvmToolchain(17)
}
}
}
重要
JVM Toolchainを使用する場合:
AGP 8.1.0-alpha09
以降が必要- 個別の
compileOptions
やjvmTarget
設定を削除する - プロジェクト内に重複設定がないか確認する
Kotlinマルチプラットフォームプロジェクトでの設定
KMPプロジェクトではshared
モジュールとandroidApp
モジュール両方の設定が必要です。
shared/build.gradle.kts
:
kotlin {
androidTarget {
compilations.all {
kotlinOptions {
jvmTarget = "17"
}
}
}
}
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlin {
jvmToolchain(17)
}
}
androidApp/build.gradle.kts
:
android {
// ...その他の設定...
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
Android Studio設定の確認
プロジェクト設定に加え、IDEの設定もバージョン整合性に影響します:
- File > Project Structure
app
モジュールのSources Compatibility
とTarget Compatibility
を確認
- Settings > Build, Execution, Deployment > Build Tools > Gradle
- Gradle JDKのバージョンがプロジェクト設定と一致しているか確認
トラブルシューティング
上記を試しても解決しない場合:
依存ライブラリの互換性確認
古いライブラリがJava 8に固定している可能性があります。ライブラリの更新が必要な場合もあります。キャッシュクリア
Android Studioのキャッシュをリセット:bash./gradlew cleanBuildCache
プロジェクト再作成
極端なケースですが、新しいプロジェクトを作成してファイルを移行することで解決する場合もあります。
バージョン選択のガイドライン
- Java 17推奨:Android Gradle Plugin 8.0+ではJava 17が公式サポート
- Java 1.8制約:レガシーシステムや特定ライブラリが必要とする場合のみ使用
- すべての設定統一:次を常に一致させる
compileOptions.sourceCompatibility
compileOptions.targetCompatibility
kotlinOptions.jvmTarget
- Gradle JDKバージョン
- Android Studioのプロジェクト設定
非推奨な方法
プロジェクト内で部分的に異なるバージョンを設定する方法は、将来的に再び同じ問題を引き起こす可能性が高いため避けてください。
まとめ
このエラーは、Javaコンパイル設定とKotlinコンパイル設定のJVMターゲットバージョン不一致によって発生します。最も効果的な解決策は:
- プロジェクト全体で統一されたバージョン(Java 17推奨)を使用する
- モジュール設定かJVM Toolchain設定で一貫性を保つ
- Android Studioの設定とプロジェクト設定を同期させる
上記の解決策を適用することで、このビルドエラーを効率的に解決できます。