Skip to content

解决Android Studio中JVM目标版本不一致的编译错误

问题描述

在Android Studio多模块项目中执行Gradle同步时,常出现以下错误:

log
Execution failed for task ':buildSrc:compileKotlin'. 
Inconsistent JVM-target compatibility detected for tasks 'compileJava' (21) and 'compileKotlin' (1.8).

问题本质:该错误表明Java和Kotlin编译器使用了不同的JVM目标版本:

  • compileJava 任务使用 JVM 21
  • compileKotlin 任务使用 JVM 1.8

这种版本不匹配会导致编译失败,常见于:

  • 升级Android Studio或JDK后
  • 多模块项目配置不一致
  • Kotlin插件与库版本不兼容

JetBrains IDE中的JVM版本不一致示意图

解决方案

通过统一Java和Kotlin的JVM目标版本来解决此问题。以下是多种有效方法:


方法1:在build.gradle中统一JVM目标版本(推荐)

修改模块级别的build.gradlebuild.gradle.kts文件:

kotlin
android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_21
        targetCompatibility = JavaVersion.VERSION_21
    }
    kotlinOptions {
        jvmTarget = "21" // 需与Java版本一致
    }
}
groovy
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_21
        targetCompatibility JavaVersion.VERSION_21
    }
    kotlinOptions {
        jvmTarget = '21' // 需与Java版本一致
    }
}

关键点:

  • sourceCompatibility/targetCompatibility 必须等于 jvmTarget
  • 常用版本:2117111.8(根据项目需求)

方法2:修复buildSrc模块配置

若项目包含buildSrc目录(自定义Gradle插件),需单独配置其Kotlin版本:

kotlin
// buildSrc/build.gradle.kts
plugins {
    `kotlin-dsl`
}

kotlin {
    jvmToolchain(21) // 设置与主模块一致的版本
}

方法3:更新Kotlin版本并同步配置

当JDK升级到21但Kotlin仍指向旧版本时:

  1. 在根项目的build.gradle中升级Kotlin:

    kotlin
    buildscript {
        ext.kotlin_version = "1.9.24" // 使用支持JVM 21的版本
    }
  2. 同步调整所有模块的jvmTarget为21


方法4:配置KMP项目

跨平台项目需显式指定Android目标的JVM版本:

kotlin
kotlin {
    androidTarget {
        compilations.all {
            kotlinOptions {
                jvmTarget = "17" // 与Java配置一致
            }
        }
    }
    // 其他平台配置...
}

方法5:修改IDE的Gradle JDK设置

若IDE缓存导致配置不生效:

  1. 关闭Android Studio
  2. 删除项目目录中的.idea文件夹
  3. 重新打开项目
  4. 进入设置:
    文件 → 设置 → 构建、执行、部署 → Gradle
  5. Gradle JDK改为与项目一致的版本

排查技巧

检查版本冲突

若出现类似警告:

Plugin version (1.9.22) is not the same as library version (1.8.0)

  1. 确认所有模块的kotlin-stdlib版本一致
  2. 在主build.gradle中统一定义Kotlin版本:
    kotlin
    ext {
        kotlinVersion = "1.9.22" // 项目统一版本
    }

多模块项目建议

  1. 在根项目的build.gradle中定义全局变量:
    kotlin
    ext {
        jvmVersion = JavaVersion.VERSION_21
    }
  2. 各子模块引用此变量确保一致

⚠️ 避免混合使用JVM版本

错误组合正确组合
Java 21 + Kotlin 1.8Java 21 + Kotlin 21
Java 17 + Kotlin 11Java 17 + Kotlin 17

通过以上步骤统一JVM目标版本,即可解决兼容性错误并成功构建项目。