升级Kotlin 1.7.0后Gradle报sourceCompatibility未解析引用解决方法
问题原因
这个报错是Kotlin 1.7.0的编译任务逻辑调整导致的:sourceCompatibility、targetCompatibility本身就是Java编译任务的专属配置,旧版本Kotlin Gradle插件额外给compileKotlin任务做了这两个属性的透传代理,1.7版本正式移除了这个非标准的代理逻辑,所以写在compileKotlin块里就会报未解析引用。
正确配置方案
任选一种配置方式即可,核心原则是Java编译目标版本和Kotlin编译jvmTarget版本必须完全一致,才能从根源避免JVM版本不匹配导致的字节码内联报错。
方案1:兼容旧版Gradle的通用配置
把Java版本配置移到Java专属编译任务下,Kotlin编译任务只保留自身的jvmTarget配置:
// 配置Java编译版本 tasks.withType<JavaCompile> { sourceCompatibility = JavaVersion.VERSION_11.toString() targetCompatibility = JavaVersion.VERSION_11.toString() } // 配置Kotlin编译版本 tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { kotlinOptions { jvmTarget = "11" } }
方案2:Kotlin 1.7+ 推荐简化配置(最优解)
直接用JVM工具链做统一配置,不需要分别给Java、Kotlin任务单独写版本参数,插件会自动对齐两边的编译目标,还会自动匹配本地对应版本的JDK,避免手动配置漏改导致的版本不一致问题:
java { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlin { jvmToolchain(11) }
补充说明
- 如果你开发的是Android项目,不需要单独写上面的全局任务配置,只需要在
android配置块的compileOptions里指定Java版本为11,再在同块的kotlinOptions里把jvmTarget设为"11"对齐即可。 - 所有场景下都不要再把
sourceCompatibility、targetCompatibility写到compileKotlin任务块里,1.7及以上版本的Kotlin编译任务已经不再支持这两个属性。
内容的提问来源于stack exchange,提问作者PHPirate
相关产品推荐
相关产品推荐

