You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle8.0+搭配高版本Java及Kapt时JVM版本不兼容问题原因咨询

问题原因解析

为什么新建Android项目默认1.8能正常运行?

新建项目时,Android Gradle插件(AGP)会自动对齐Java和Kotlin的JVM目标版本:

  • 默认情况下,compileOptions的sourceCompatibility和targetCompatibility被设为1.8
  • AGP会同步设置kotlinOptions的jvmTarget为1.8,确保Java和Kotlin编译任务的版本一致
  • 旧版Gradle(<8.0)对跨语言编译任务的JVM版本一致性校验并不严格,即使有细微差异也不会主动抛出错误,加上AGP的自动适配,所以默认1.8配置能正常运行

为什么三个条件同时满足会触发错误?

当Gradle≥8.0、Java版本>1.8、添加Kapt插件这三个条件同时成立时,会触发版本不一致错误,核心原因如下:

  1. Gradle 8.0+的严格校验机制
    Gradle 8.0开始强化了编译任务的JVM版本一致性检查,因为Java和Kotlin生成的字节码版本必须匹配,否则可能出现运行时的类加载错误、方法签名不兼容等问题。只要发现Java编译任务(compileDebugJavaWithJavac)和Kotlin相关编译任务的JVM目标版本不一致,就会直接抛出异常。

  2. Java版本>1.8时的默认行为差异
    当本地Java环境版本高于1.8(比如17),而你没有显式设置compileOptions的版本时:

    • Java编译任务仍会沿用AGP的默认值1.8
    • Kotlin编译任务(包括Kapt依赖的kaptGenerateStubsDebugKotlin任务)会默认继承本地Java的版本(17),因为Kotlin编译器会优先使用当前环境的JDK版本作为目标版本(在Gradle 8.0+的规则下)
      这就导致两个任务的JVM目标版本出现1.8和17的冲突。
  3. Kapt插件的触发作用
    Kapt依赖Kotlin的stub生成任务(kaptGenerateStubsDebugKotlin)来为注解处理器生成Java存根。如果没有添加Kapt插件,这个stub任务不会被创建,Gradle也就不会去对比它和Java编译任务的版本。只有当Kapt插件存在时,这个任务才会被纳入校验范围,进而触发版本不一致的错误。

补充:正确的配置示例

要解决这个问题,只需显式同步compileOptions和kotlinOptions的JVM版本,比如统一设为17:

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }

    kotlinOptions {
        jvmTarget = "17"
    }
}

内容的提问来源于stack exchange,提问作者Ali Doran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 11:35:10