Gradle 8搭配Kotlin 1.8编译时JVM目标版本不一致致构建失败
问题成因及解决方案
问题描述
使用Gradle 8 + Kotlin 1.8编译多模块项目时,某模块出现如下错误:
compileDebugJavaWithJavac' task (current target is 1.8) and 'kaptGenerateStubsDebugKotlin' task (current target is 17)
jvm target compatibility should be set to the same Java version.
该模块已在build.gradle中配置统一的JVM目标(1.8),但问题依然存在。
可能成因
- 根项目全局配置覆盖模块设置:根目录的
gradle.properties或根项目build.gradle的allprojects/subprojects块中,可能设置了全局的Kotlin JVM目标为17,优先级高于模块本地配置,导致kapt生成stubs时使用了全局配置。 - 依赖模块传递JVM目标:该模块依赖的其他本地模块或第三方库,配置了更高的JVM目标(17),kapt在处理注解生成stubs时继承了依赖的JVM版本。
- Kotlin/Gradle兼容性问题:Gradle 8对Kotlin插件版本要求较高,Kotlin 1.8.x早期版本可能存在配置读取bug,导致kapt未正确识别模块的
kotlinOptions设置。 - Hilt插件影响:Hilt的kapt注解处理器在生成stubs时,可能未同步模块的JVM目标配置,需要单独指定。
解决方案
1. 检查并修正全局配置
- 打开根目录
gradle.properties,查找是否有类似kotlin.jvm.target=17的配置,若存在,要么修改为1.8,要么在模块中显式覆盖。 - 检查根项目
build.gradle的allprojects或subprojects块,若有统一设置kotlinOptions.jvmTarget=17,移除该全局配置,让模块使用本地设置。
2. 显式为kapt指定JVM目标
在模块的build.gradle中添加以下配置,强制kapt使用1.8版本:
// 为kapt生成stubs任务单独设置JVM目标 tasks.withType(org.jetbrains.kotlin.gradle.tasks.KaptGenerateStubs).configureEach { kotlinOptions.jvmTarget = "1.8" } // 为kapt的javac选项设置版本 kapt { javacOptions { option("-source", "1.8") option("-target", "1.8") } }
3. 检查依赖模块配置
查看该模块依赖的所有本地模块,确认其kotlinOptions.jvmTarget是否为1.8,若有模块使用17,要么将该依赖模块的JVM目标改为1.8,要么将当前模块的JVM目标升级为17(需确保compileSdk、minSdk等兼容)。
4. 升级Kotlin插件版本
Gradle 8建议搭配Kotlin 1.8.20及以上版本,在根项目的版本配置文件(如libs.versions.toml)中,将Kotlin插件版本升级至1.8.20或更高,重新同步项目。
内容的提问来源于stack exchange,提问作者lelestacia
相关产品推荐
相关产品推荐

