Gradle 中 Java 与 Kotlin JVM 目标版本不一致的解决方案
问题描述
在使用 Gradle 构建项目时,经常会遇到以下编译错误:
'compileJava' task (current target is 11) and 'compileKotlin' task (current target is 1.8) jvm target compatibility should be set to the same Java version.
这个错误表明 Java 编译任务和 Kotlin 编译任务使用了不同的 JVM 目标版本,导致兼容性问题。在 Android 项目中,这可能表现为:
'compileDebugJavaWithJavac' task (current target is 1.8) and 'compileDebugKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.
根本原因
此问题的根本原因是 Java 和 Kotlin 编译任务的 JVM 目标版本配置不一致。常见的原因包括:
- 不同模块中的版本配置不统一
- 使用的 Gradle 版本与 Java 版本不兼容
- Kotlin 插件的特定配置问题(特别是使用
kapt
时) - Android Studio 项目设置与 Gradle 配置不一致
解决方案
方案一:统一配置 Java 和 Kotlin 的 JVM 版本
在 Android 项目的 build.gradle
文件中,确保 compileOptions
和 kotlinOptions
使用相同的版本:
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = "11"
}
}
TIP
根据你的项目需求,可以将 VERSION_11
替换为 VERSION_1_8
、VERSION_17
或其他版本,但必须确保两个配置使用相同的版本。
方案二:使用 JVM Toolchain 统一配置
Kotlin Gradle 插件提供了更简洁的配置方式:
kotlin {
jvmToolchain(11) // 或者 8, 17, 等
}
这种方法会自动配置所有相关的编译任务,确保一致性。
方案三:非 Android 项目的配置
对于纯 Java/Kotlin 项目(不使用 Android 插件),在 build.gradle.kts
中添加:
java {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions {
jvmTarget = "11"
}
}
方案四:处理 kapt 的特殊情况
如果你使用 kapt(Kotlin 注解处理工具),可能需要额外配置:
import org.jetbrains.kotlin.gradle.tasks.KaptGenerateStubsTask
tasks.withType<KaptGenerateStubsTask> {
kotlinOptions.jvmTarget = "11"
}
方案五:多模块项目的统一配置
对于包含多个模块的项目,需要在每个模块的 build.gradle
文件中保持一致的配置,或者在根项目的 build.gradle
中统一配置:
allprojects {
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions {
jvmTarget = "11"
}
}
}
常见问题与解决方法
问题一:版本号表示方法混淆
WARNING
注意 Java 版本号的两种表示方法:
JavaVersion.VERSION_1_8
表示 Java 8JavaVersion.VERSION_11
表示 Java 11VERSION_19
表示 Java 19(不是 1.9)
在 kotlinOptions
中应使用字符串形式:"1.8"、"11"、"17" 等。
问题二:Gradle 版本兼容性
某些 Gradle 版本(如 8.0)可能会引入此问题。如果其他方法无效,可以尝试降级 Gradle 版本:
# gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
问题三:Android Studio JDK 设置
确保 Android Studio 使用的 JDK 版本与 Gradle 配置一致:
- 打开 File → Project Structure → SDK Location
- 检查 JDK Location 设置的版本
- 确保与
build.gradle
中的配置匹配
高级配置
使用工具链进行全面配置
对于复杂项目,可以使用完整的工具链配置:
kotlin {
jvmToolchain {
languageVersion.set(JavaLanguageVersion.of("11"))
// 可选:指定供应商(如:JVM_VENDOR_SPECIFIC)
// vendor.set(JvmVendorSpec.ADOPTIUM)
}
}
禁用验证(不推荐)
如果确认配置正确但仍看到警告,可以临时禁用验证:
# gradle.properties
kotlin.jvm.target.validation.mode = IGNORE
DANGER
这种方法只是隐藏了警告,并没有真正解决问题。建议只在确认配置正确且警告是误报时使用。
总结
解决 Java 和 Kotlin JVM 目标版本不一致的问题,关键在于确保所有相关配置使用相同的 Java 版本。主要步骤包括:
- 检查并统一
compileOptions
和kotlinOptions
的配置 - 考虑使用
jvmToolchain
简化配置 - 确保多模块项目中的所有模块配置一致
- 检查 Android Studio 的 JDK 设置与 Gradle 配置匹配
- 必要时处理 kapt 的特殊配置需求
遵循这些步骤,可以有效解决 Gradle 构建中的 JVM 目标版本兼容性问题。