AGP 8.1.0中jvmTarget: String已废弃,Kotlin DSL环境下的推荐迁移方案咨询
AGP 8.1.0中jvmTarget: String已废弃,Kotlin DSL环境下的推荐迁移方案咨询
嗨,我前段时间升级AGP到8.1.0的时候也碰到了这个废弃警告,当时还愣了一下,原来的字符串写法突然就触发提示了,后来查了官方配置说明、踩了几个小坑,现在把靠谱的迁移方式分享给你~
首先得说为啥官方要废弃字符串类型的jvmTarget:从AGP 8.0+配合Kotlin Gradle Plugin 1.8+开始,官方就主推类型安全的枚举配置了——既能避免拼写错误(比如把"11"写成"l1"这种低级失误),也能和Gradle的类型安全配置体系对齐,长期来看项目维护性会好很多。
接下来是具体的迁移写法,分几种常用场景给你捋清楚:
1. 模块级build.gradle.kts(Android模块)
原来的写法(会触发废弃警告):
android { kotlinOptions { jvmTarget = "11" } }
现在推荐两种写法,选顺手的用就行:
写法一:用Kotlin官方的JvmTarget枚举
需要先导入枚举类(IDE一般会自动提示导入,不用手动敲):
import org.jetbrains.kotlin.gradle.dsl.JvmTarget android { // 建议同步配置Java编译选项,保证Java和Kotlin代码的编译目标完全一致 compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JvmTarget.JVM_11 } }
写法二:直接复用JavaVersion枚举(和Java编译配置对齐)
这种写法不用额外导入类,因为JavaVersion是Gradle核心API自带的:
android { compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JavaVersion.VERSION_11 } }
小提醒:千万别忘了同步配置
compileOptions,不然可能出现Java代码用17编译、Kotlin代码用11编译的兼容性问题,统一版本才是稳妥的做法。
2. 项目级统一配置(所有Android模块生效)
如果你的项目有多个模块,不想挨个改配置,可以在根目录的build.gradle.kts里统一设置:
import org.jetbrains.kotlin.gradle.dsl.JvmTarget subprojects { // 只对应用了Kotlin Android插件的模块生效,避免影响纯Java模块 plugins.withType<org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPlugin> { extensions.configure<com.android.build.api.dsl.CommonExtension<*, *, *, *, *>> { compileOptions { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JvmTarget.JVM_11 } } } }
3. 纯Kotlin JVM项目(非Android模块)
如果你还有纯Kotlin的模块,配置逻辑类似,直接在kotlin块里用枚举就行:
plugins { kotlin("jvm") version "1.9.0" // 版本和AGP保持兼容即可 } kotlin { // 方式一:用JvmTarget枚举 jvmTarget = JvmTarget.JVM_11 // 方式二:用工具链配置(更推荐,会自动下载对应版本的JDK) jvmToolchain(11) }
最后再提个小注意点:AGP 8.1.0建议搭配Kotlin Gradle Plugin 1.9.0及以上版本,这样枚举配置的兼容性最好,不会出现奇怪的编译错误。
我自己用第一种写法(JvmTarget枚举)跑了好几个项目了,完全没问题,废弃警告也彻底消失了,你可以放心试~
内容来源于stack exchange
相关产品推荐
相关产品推荐

