JVM 目标版本不一致错误解决方案
核心问题:
compileDebugJavaWithJavac
(1.8) 和compileDebugKotlin
(17) 任务使用的 JVM 目标版本不一致,导致 Gradle 构建失败
问题描述
当更新 Android 项目依赖项或升级 Gradle/Kotlin 版本后,常出现以下构建错误:
* 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.gradle
或 build.gradle.kts
中统一配置 Java 和 Kotlin 的版本:
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
方案2:使用 JVM Toolchain(最佳实践)
Kotlin 官方推荐的现代配置方式,可自动处理工具链:
// 在 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
中添加:
// 针对问题模块强制设置版本
project(':problem_module').afterEvaluate {
android.compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
}
方案4:检查全局配置
通过全局搜索查找所有包含 compileOptions
或 jvmTarget
的 Gradle 文件,确保所有模块配置一致。
# 在项目根目录执行
grep -r "compileOptions" .
grep -r "jvmTarget" .
临时解决方案(不推荐)
在 gradle.properties
中添加忽略验证(仅作为应急手段):
# 屏蔽版本检查警告
kotlin.jvm.target.validation.mode = IGNORE
注意
此方法仅绕过错误检查,可能导致:
- 运行时兼容性问题
- 未来升级障碍
- 跨平台构建失败
工具链与版本检查表
确保环境一致性:
组件 | 检查点 | 验证命令 |
---|---|---|
JDK | 当前活动版本 | java --version |
Gradle | 项目实际使用的版本 | ./gradlew --version |
Kotlin | 插件版本 | 查看 buildscript 的 ext.kotlin_version |
AGP | Android Gradle 插件版本 | 查看 build.gradle 的 classpath |
常见陷阱
多模块配置遗漏:子模块未覆盖父模块设置
groovy// 子模块需独立配置 android { compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } }
过时的 Kotlin 语法:避免使用弃用写法
diffkotlinOptions { - jvmTarget '17' // Deprecated + jvmTarget = "17" // 正确语法 }
版本号格式不一致:
- Java 版本常量:
JavaVersion.VERSION_17
- Kotlin 目标值:
"17"
或'17'
- Java 版本常量:
解决方案策略选择
关键提示:优先使用
jvmToolchain()
方案确保长期兼容性,避免临时绕过方案。升级 AGP 和 Kotlin 插件至最新稳定版可彻底避免此类问题。