Skip to content

解决 Android Studio 编译错误:JVM 目标版本不匹配

问题核心
当 Kotlin 的 kaptGenerateStubsDebugKotlin 任务 (Java 17) 与 Java 编译任务 compileDebugJavaWithJavac (Java 1.8) 的 JVM 目标版本不一致时,会导致以下构建失败:

'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.

根本原因

当 Kotlin 注解处理 (kapt) 使用更高 Java 版本 (JDK 17) 时,而普通 Java 代码使用较低版本 (JDK 1.8),两者因 JVM 字节码版本不兼容而冲突。常见于:

  • Android Gradle 插件 (AGP) 版本与 Kotlin 插件不匹配
  • 多模块项目中各模块 JDK 版本配置不一致
  • 过时的 sourceCompatibility/targetCompatibility 配置

解决方案

以下任选一种方法即可解决,推荐使用解决方案1或2

方案1:统一模块级配置

在模块的 build.gradle (通常位于 app/build.gradle) 中统一设置 JVM 目标版本

groovy
android {
    compileOptions {
        // 二选一 ↓↓↓
        sourceCompatibility JavaVersion.VERSION_17 // 推荐使用 JDK 17
        targetCompatibility JavaVersion.VERSION_17
        // 或使用旧版本(如需兼容)
        // sourceCompatibility JavaVersion.VERSION_1_8 
        // targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        // 与 compileOptions 保持一致!
        jvmTarget = "17" // 对应 JavaVersion.VERSION_17
        // jvmTarget = "1.8" // 对应 JavaVersion.VERSION_1_8
    }
}

优点:简单直接,适用于单模块项目
⚠️ 注意:确保所有模块配置一致

方案2:全局配置(多模块项目)

在根项目的 build.gradle 中统一配置所有子模块:

groovy
subprojects {
    afterEvaluate { project ->
        if (project.findProperty('android')) { // 仅限 Android 模块
            android {
                compileOptions {
                    sourceCompatibility JavaVersion.VERSION_17
                    targetCompatibility JavaVersion.VERSION_17
                }
            }
            // 配置 Kotlin 编译选项
            tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
                kotlinOptions.jvmTarget = "17"
            }
        }
    }
}

优点:一次性统一所有模块配置
🛠 适用场景:包含多个库模块的中大型项目

方案3:使用 JVM 工具链(推荐新项目)

build.gradle 中启用 JDK 工具链管理:

groovy
kotlin {
    jvmToolchain(17) // 设置全局 JVM 版本
    // 使用 Android 扩展时
    androidTarget {
        compilations.all {
            compileTaskProvider.configure {
                compilerOptions.jvmTarget.set(JvmTarget.JVM_17)
            }
        }
    }
}

优点:Gradle 自动管理 JDK,避免手动配置冲突
⚠️ 前提

  • AGP ≥ 8.1.0
  • Kotlin ≥ 1.8.20

验证修复

修改后执行以下操作确保生效:

  1. 清理项目:Build > Clean Project
  2. 同步 Gradle:点击工具栏 Sync Project 图标
  3. 重新构建:Build > Rebuild Project

确认 compileDebugJavaWithJavackaptGenerateStubsDebugKotlin 的日志中显示相同 JVM 版本

[KOTLIN] JVM target: 17
[JAVA] sourceCompatibility: 17, targetCompatibility: 17

常见陷阱

  1. 依赖库版本冲突
    检查第三方库(如 Hilt、Room)是否要求特定 JDK 版本:

    gradle
    // 正确示例:Dagger 兼容配置
    implementation 'com.google.dagger:dagger:2.48.1'
    kapt 'com.google.dagger:dagger-compiler:2.48.1'
  2. Android Studio 内部 JDK 设置
    确认 IDE 使用一致 JDK:File > Project Structure > SDK Location > JDK Location
    JDK 设置

  3. Kotlin 插件过时
    在根 build.gradle 升级 Kotlin 插件:

    groovy
    plugins {
        id 'org.jetbrains.kotlin.android' version '1.9.20' apply false
    }

终极解决手段

如果上述方法无效:

  1. 备份 settings.gradlebuild.gradle
  2. 删除项目中的 .idea.gradlebuild 目录
  3. 执行:
    bash
    ./gradlew cleanBuildCache
    ./gradlew --stop
  4. 在 Android Studio 中重新导入项目

💡 预防建议:新项目应从一开始统一使用 JDK 17(Android Studio Giraffe+ 默认支持)

通过统一 JVM 目标版本,即可解决该兼容性构建错误。