Skip to content

Androidビルドエラー:JavaとKotlinのJVMターゲットバージョン不一致の解決法

問題の説明

Android Studioでプロジェクトをビルドする際、以下のエラーが発生することがあります:

text
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のバージョンを統一することです。

groovy
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = '17'
    }
}

Kotlinスクリプト(.kts)を使用している場合:

kotlin
android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
}

TIP

VERSION_17VERSION_1_8(Java 8)など、プロジェクトに適したバージョンに置き換えてください。すべての設定で同じバージョンを使用することが重要です。

方法2: プロジェクト全体の設定(サブプロジェクト設定)

マルチモジュールプロジェクトでは、ルートのbuild.gradleで全モジュールに適用する設定を定義します。

groovy
// ルートの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バージョンを統一できます。

groovy
// ルートのbuild.gradleに追加
subprojects {
    afterEvaluate {
        kotlin {
            jvmToolchain(17)
        }
    }
}

重要

JVM Toolchainを使用する場合:

  1. AGP 8.1.0-alpha09以降が必要
  2. 個別のcompileOptionsjvmTarget設定を削除する
  3. プロジェクト内に重複設定がないか確認する

Kotlinマルチプラットフォームプロジェクトでの設定

KMPプロジェクトではsharedモジュールとandroidAppモジュール両方の設定が必要です。

shared/build.gradle.kts:

kotlin
kotlin {
    androidTarget {
        compilations.all {
            kotlinOptions {
                jvmTarget = "17"
            }
        }
    }
}

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlin {
        jvmToolchain(17)
    }
}

androidApp/build.gradle.kts:

kotlin
android {
    // ...その他の設定...
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
}

Android Studio設定の確認

プロジェクト設定に加え、IDEの設定もバージョン整合性に影響します:

  1. File > Project Structure
    • appモジュールのSources CompatibilityTarget Compatibilityを確認
  2. Settings > Build, Execution, Deployment > Build Tools > Gradle
    • Gradle JDKのバージョンがプロジェクト設定と一致しているか確認

Android Studio Gradle設定

トラブルシューティング

上記を試しても解決しない場合:

  1. 依存ライブラリの互換性確認
    古いライブラリがJava 8に固定している可能性があります。ライブラリの更新が必要な場合もあります。

  2. キャッシュクリア
    Android Studioのキャッシュをリセット:

    bash
    ./gradlew cleanBuildCache
  3. プロジェクト再作成
    極端なケースですが、新しいプロジェクトを作成してファイルを移行することで解決する場合もあります。

バージョン選択のガイドライン

  • 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ターゲットバージョン不一致によって発生します。最も効果的な解決策は:

  1. プロジェクト全体で統一されたバージョン(Java 17推奨)を使用する
  2. モジュール設定かJVM Toolchain設定で一貫性を保つ
  3. Android Studioの設定とプロジェクト設定を同期させる

上記の解決策を適用することで、このビルドエラーを効率的に解決できます。