直接结论:不是kotlin版本错了,是jvmtarget值格式错误(如"1.9"或"21"),应统一设为带引号的合法版本如"17",并确保gradle jdk、compileoptions与kotlinoptions.jvmtarget三者一致。

直接结论:不是Kotlin版本错了,是 jvmTarget 值写成了不被当前 Kotlin 编译器支持的字符串格式,比如 "1.9" 或 "21"(未加引号、带点号、版本超前)。
报错 Unknown Kotlin JVM target: 21 怎么修
这是新版 Android Studio Meerkat(2024.3.1)+ Gradle 8.9 的典型现象。它不表示你不能用 JDK 21,而是 Kotlin 插件默认读取了 IDE 自带的 JDK 21,并试图把 jvmTarget 设为 "21" ——但 Kotlin 1.9.x(当前主流 AGP 捆绑版本)只认 "17"、"18"、"19"、"20",不认裸数字 21 或带点号的 1.9。
- 打开
File > Project Structure > SDK Location,检查Gradle JDK是否指向了 JDK 21;如果是,点击[Download JDK]选17版本并应用 - 同步后若仍报错,去
app/build.gradle显式锁定:android { kotlinOptions { jvmTarget = "17" } } - 注意:不要写成
jvmTarget = 17(无引号)、jvmTarget = "21"(Kotlin 1.9.24 不支持)、jvmTarget = "1.9"(旧版写法,已废弃)
compileDebugJavaWithJavac 和 compileDebugKotlin 目标不一致
Gradle 构建时两个任务用的字节码版本不同,比如 Java 用 1.8、Kotlin 用 17,就会触发兼容性校验失败。这不是警告,是构建中断。
- 必须让三者对齐:
compileOptions.sourceCompatibility、compileOptions.targetCompatibility、kotlinOptions.jvmTarget - Android 推荐统一设为
"17"(AGP 8.4+ 官方要求),但若项目还依赖老库(如某些 Room 2.5.x),降为"1.8"更稳 - 多模块项目中,根
build.gradle的java { toolchain.version = "17" }只控制 Gradle 自身编译任务,不自动透传给 Kotlin;每个子模块仍需单独配kotlinOptions
Kapt/KSP 任务也报 Inconsistent JVM-target compatibility
Kapt(或 KSP)生成 Kotlin stubs 时,会启动一个独立的 Kotlin 编译器实例,它默认继承项目的 jvmTarget,但若项目里没显式配置,就可能 fallback 到插件默认值(比如 Kotlin 1.9 默认试 "20"),而 Java 任务还是 "17",于是冲突。
- 在
android {}外层加全局配置更可靠:kotlin { compilerOptions { jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) } } - 如果用了 KSP,还需额外确认
ksp {}块里没覆盖jvmTarget;KSP 本身不设 target,但它调用的 Kotlin 编译器受上述全局配置影响 - 清理缓存再 sync:
./gradlew --stop && ./gradlew clean && File > Invalidate Caches and Restart
最容易被忽略的是:IDE 显示绿色(代码无报错)≠ 构建能过。因为 IDE 的语法检查走的是内置 Kotlin 插件快照,而 Gradle 构建用的是项目声明的 Kotlin 版本和 jvmTarget。一旦两者 mismatch,sync 成功、写代码顺畅,到真正 build 就崩。所以每次升级 Android Studio 或 Gradle,第一件事不是改业务逻辑,是核对这三处:Gradle JDK、compileOptions、kotlinOptions.jvmTarget。











