Skip to content

Kotlin JVMターゲットの非互換エラーの解決法

kotlin
// 基本設定例 (appレベルのbuild.gradle.kts)
android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
}

問題の概要

Android StudioでGradleの同期またはビルド時に以下のエラーが発生する場合:

log
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コンパイラのターゲット設定不一致が主原因です:

  1. JDKアップデートでデフォルト設定が変更されたが、Kotlin設定が追従していない
  2. モジュール/サブプロジェクト毎に異なるバージョン指定が存在
  3. KotlinプラグインとJavaバージョンの互換性の問題

注意: JDK 17以降では、1.8のような旧形式の指定は非推奨です。数値のみ(例: 17)を使用してください。


効果的な解決方法

方法1: アプリケーションレベルの設定統一(推奨)

app/build.gradle.ktsにJava/Kotlinの互換設定を追加:

kotlin
android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17" // "11", "21" 等プロジェクトに適したバージョン
    }
}

方法2: buildSrcモジュールの設定修正

buildSrc/build.gradle.ktsがある場合、専用の設定が必要:

kotlin
plugins {
    `kotlin-dsl`
}
kotlin {
    jvmToolchain(21) // メインプロジェクトと一貫したバージョン
}

方法3: Gradle JDK設定の変更

Android Studioの設定からプロジェクト全体のJDKバージョンを統一:

  1. File > Settings (Ctrl+Alt+S)
  2. Build, Execution, Deployment > Build Tools > Gradle
  3. Gradle JDKで適切なバージョンを選択 Gradle JDK設定画面

方法4: KotlinバージョンとJDKの互換性確保

KotlinとJDKの互換性問題が原因の場合は:

  1. プロジェクトレベルのbuild.gradle.ktsを開く
  2. Kotlinバージョンを最新に更新(例:1.9.24)
    kotlin
    plugins {
        kotlin("jvm") version "1.9.24" // {x} 部分を最新バージョンに
    }

方法5: マルチモジュール環境での個別設定

特定モジュールのみに問題がある場合:

  1. エラーログで問題モジュールを特定(例::expo-modules-core$android-annotation
  2. 該当モジュールのbuild.gradle.ktsを開く
  3. 個別にjvmTargetを設定:
    kotlin
    kotlin {
        compilerOptions {
            jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17)
        }
    }

ビルドキャッシュの問題

.gradle.ideaディレクトリを削除後、File > Sync Project with Gradle Filesを実行すると問題解決する場合があります:

bash
rm -rf .gradle
rm -rf .idea

ベストプラクティスとバージョン選択ガイド

JDKバージョン選定基準

プロジェクトタイプ推奨バージョン補足
新規プロジェクトJDK 21LTS版で長期サポート対象
既存AndroidプロジェクトJDK 17Android互換性バランス最適
レガシーシステムJDK 11旧環境対応が必要な場合のみ

Kotlinコンパイラオプションの新記法

Kotlin 1.5以降ではjvmToolchain利用が簡潔:

kotlin
// 従来記法(廃止予定)
kotlinOptions { jvmTarget = "11" }

// 現代的な記法(推奨)
kotlin { jvmToolchain(11) }

バージョン確認コマンド

ターミナルで以下を実行し、全モジュールの設定を一括確認:

bash
./gradlew -q properties | grep jvmTarget

出力例:

jvmTarget: 17
:buildSrc jvmTarget: 11

不一致があるモジュールが特定可能


結論

「JVM-target compatibility detected」エラーは、全モジュールでのJVMターゲット設定の一貫性確保で確実に解決できます。特に:

  1. 主要設定箇所3つを確認:

    • アプリケーションレベル(app/build.gradle.kts)
    • プロジェクトレベル(build.gradle.kts)
    • buildSrcモジュール(buildSrc/build.gradle.kts)
  2. 最新ツールチェーンの採用:

    • JDK 17/21 + Kotlin 1.9+の組み合わせ
    • jvmToolchain()の積極利用
  3. マルチモジュール環境での集中管理:

    • バージョン変数を共通化(例: extra["jvmVersion"] = 17
    • サブプロジェクト設定の継承を活用

Kotlin/Java混在プロジェクトでは、定期的なjvmTarget設定の監査を推奨します。