Skip to content

JVM 目标版本不一致错误解决方案

核心问题compileDebugJavaWithJavac (1.8) 和 compileDebugKotlin (17) 任务使用的 JVM 目标版本不一致,导致 Gradle 构建失败

问题描述

当更新 Android 项目依赖项或升级 Gradle/Kotlin 版本后,常出现以下构建错误:

groovy
* What went wrong:
Execution failed for task ':flutter_google_places_sdk_android:compileDebugKotlin'.
> Inconsistent JVM-target compatibility detected for tasks 
  'compileDebugJavaWithJavac' (1.8) and 'compileDebugKotlin' (17).

  Consider using JVM Toolchain: https://kotl.in/gradle/jvm/toolchain

典型环境特征

  • JDK 17+ 环境
  • Gradle 8.x+
  • Kotlin 1.8.0+
  • Android Gradle Plugin (AGP) 8.0.0+

根本原因分析

该错误表明 Java 和 Kotlin 编译器任务使用了不兼容的 JVM 目标版本:

  • compileJavaWithJavac 任务使用 Java 8(1.8)
  • compileKotlin 任务使用 Java 17
    两者版本不一致违反了 Gradle 的 JVM 目标验证规则。

完整解决方案

方案1:统一基础配置(推荐)

在模块的 build.gradlebuild.gradle.kts 中统一配置 Java 和 Kotlin 的版本:

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

方案2:使用 JVM Toolchain(最佳实践)

Kotlin 官方推荐的现代配置方式,可自动处理工具链:

groovy
// 在 android 块之外配置
kotlin {
    jvmToolchain(17)
}

// 可移除旧版兼容性配置
android {
    compileOptions {
        // 不再需要 sourceCompatibility/targetCompatibility
    }
}

兼容性要求

使用 jvmToolchain() 需要:

  • Android Gradle Plugin ≥ 8.1.0-alpha09
  • Gradle ≥ 8.0
  • Kotlin ≥ 1.9.0

方案3:修复第三方库的配置

若错误来自特定模块(如 flutter_google_places_sdk_android),在项目级 build.gradle 中添加:

groovy
// 针对问题模块强制设置版本
project(':problem_module').afterEvaluate {
    android.compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = '17'
    }
}

方案4:检查全局配置

通过全局搜索查找所有包含 compileOptionsjvmTarget 的 Gradle 文件,确保所有模块配置一致。

bash
# 在项目根目录执行
grep -r "compileOptions" .
grep -r "jvmTarget" .

临时解决方案(不推荐)

gradle.properties 中添加忽略验证(仅作为应急手段):

properties
# 屏蔽版本检查警告
kotlin.jvm.target.validation.mode = IGNORE

注意

此方法仅绕过错误检查,可能导致:

  • 运行时兼容性问题
  • 未来升级障碍
  • 跨平台构建失败

工具链与版本检查表

确保环境一致性:

组件检查点验证命令
JDK当前活动版本java --version
Gradle项目实际使用的版本./gradlew --version
Kotlin插件版本查看 buildscriptext.kotlin_version
AGPAndroid Gradle 插件版本查看 build.gradleclasspath

常见陷阱

  1. 多模块配置遗漏:子模块未覆盖父模块设置

    groovy
    // 子模块需独立配置
    android {
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_17
            targetCompatibility JavaVersion.VERSION_17
        }
    }
  2. 过时的 Kotlin 语法:避免使用弃用写法

    diff
    kotlinOptions {
    -   jvmTarget '17'  // Deprecated
    +   jvmTarget = "17" // 正确语法
    }
  3. 版本号格式不一致

    • Java 版本常量:JavaVersion.VERSION_17
    • Kotlin 目标值:"17"'17'

解决方案策略选择

关键提示:优先使用 jvmToolchain() 方案确保长期兼容性,避免临时绕过方案。升级 AGP 和 Kotlin 插件至最新稳定版可彻底避免此类问题。