JVM目标版本不一致报错疑问:Java向后兼容为何不生效?
问题解析与解决
这个错误和Java的向后兼容性无关,本质是Kotlin注解处理任务(kapt)与Java编译任务的JVM目标版本不匹配,是Gradle构建工具的强制校验逻辑导致的,具体原因如下:
- Java向后兼容指的是高版本JDK可以运行低版本编译的字节码,这是运行时特性。而你遇到的是编译阶段的问题:构建工具要求所有编译相关任务(包括Java编译、Kotlin编译、Kapt注解处理)的JVM目标版本必须一致,否则可能出现字节码兼容性问题——比如Kapt生成的桩代码用了JDK19的特性,而Java编译用18目标,反过来也可能导致不兼容。
- 你更新JDK到19后,Kotlin编译任务默认会使用当前JDK的版本作为目标版本(即19),但你的Java编译任务仍然配置为18,两者版本差触发了构建校验错误。
解决方法
在Gradle配置中强制将Kotlin的JVM目标版本设置为18,和Java编译任务保持一致,不管当前使用的是JDK19:
Groovy脚本(build.gradle)
android { compileOptions { sourceCompatibility JavaVersion.VERSION_18 targetCompatibility JavaVersion.VERSION_18 } kotlinOptions { jvmTarget = "18" } }
Kotlin DSL(build.gradle.kts)
android { compileOptions { sourceCompatibility = JavaVersion.VERSION_18 targetCompatibility = JavaVersion.VERSION_18 } kotlinOptions { jvmTarget = "18" } }
设置完成后,kapt任务会自动同步使用这个JVM目标版本,和Java编译任务版本对齐,错误就会消失。
内容的提问来源于stack exchange,提问作者yardımcı Etis
相关产品推荐
相关产品推荐

