
Android 项目中 Kotlin 与 Java 编译目标版本(jvmTarget)不一致会导致构建失败,常见于 compileKotlin(如 JVM 17)与 compileJava(如 Java 1.7)版本冲突。本文提供兼容性配置方案,确保两者统一为同一 JDK 版本。
android 项目中 kotlin 与 java 编译目标版本(jvmtarget)不一致会导致构建失败,常见于 `compilekotlin`(如 jvm 17)与 `compilejava`(如 java 1.7)版本冲突。本文提供兼容性配置方案,确保两者统一为同一 jdk 版本。
在 Android + Kotlin 项目中,Gradle 构建时若出现如下错误:
Execution failed for task ':info:compileKotlin'. > 'compileJava' task (current target is 1.7) and 'compileKotlin' task (current target is 17) — jvm target compatibility should be set to the same Java version.
这表明 Kotlin 编译器生成的字节码版本(kotlinOptions.jvmTarget)与 Java 编译器(sourceCompatibility / targetCompatibility)不匹配。Kotlin 要求其 jvmTarget 必须等于或低于 Java 的 targetCompatibility,否则会触发校验失败。
✅ 根本解决方案:在项目根目录的 build.gradle(或 build.gradle.kts)中,统一协调 Kotlin 与 Java 的 JVM 目标版本。推荐使用以下 Groovy 配置(适用于 Gradle 7.0+,含 Android Gradle Plugin 7.0+):
subprojects {
afterEvaluate {
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
if (project.plugins.hasPlugin("com.android.application") ||
project.plugins.hasPlugin("com.android.library")) {
// Android 模块:复用 android.compileOptions 配置
kotlinOptions.jvmTarget = android.compileOptions.sourceCompatibility.toString()
} else {
// 纯 Kotlin 模块:复用 project.sourceCompatibility
kotlinOptions.jvmTarget = sourceCompatibility.toString()
}
}
}
}
⚠️ 关键注意事项:
- 此配置需放在 根项目的
build.gradle(即settings.gradle同级的build.gradle),而非模块级build.gradle; - 确保已在
android { compileOptions { ... } }中显式声明了 Java 版本,例如:android { compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" // 此行可保留,但会被上述 subprojects 配置覆盖,建议注释或移除以防冲突 } } - 若使用 Kotlin DSL(
build.gradle.kts),请改用等效写法(需适配KotlinCompile类型判断和android扩展访问逻辑); - 不要仅依赖 IDE 的「Project Structure」→「Gradle JDK」设置——它只影响 Gradle 运行时 JDK,不影响编译输出字节码版本;真正起作用的是
sourceCompatibility和kotlinOptions.jvmTarget。
? 验证是否生效:
执行 ./gradlew :info:compileKotlin --info,观察日志中 kotlinOptions.jvmTarget 是否已同步为 17(或你设定的版本)。若仍报错,请检查是否存在多层 kotlinOptions 覆盖(如模块内重复配置),建议全局统一管理。
? 总结:JVM 兼容性问题本质是字节码契约一致性问题。通过 subprojects + afterEvaluate 动态绑定 Kotlin 的 jvmTarget 到 Java 的 sourceCompatibility,可实现跨模块、跨插件(Android/Kotlin/JVM)的自动对齐,大幅提升工程可维护性与构建稳定性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











