Kotlin+Gradle适配特定JVM时Java兼容配置与jvmTarget配置的差异
Gradle JVM版本配置差异说明
两种配置的最终效果并不一致,分别作用于不同的编译环节,在同时包含Java和Kotlin代码的项目中必须同时配置才能保证所有编译产物的JVM版本统一。
1. java代码块配置的作用
sourceCompatibility和targetCompatibility仅对Java代码的编译生效:
sourceCompatibility:约束Java源代码的语法兼容版本,设置为11时,Java代码不允许使用JDK 11以上的语法特性,否则会编译报错targetCompatibility:指定Java编译器输出的class文件的字节码版本,设置为11时,Java代码编译生成的产物只能运行在JDK 11及以上版本的虚拟机中
纯Kotlin项目中这两个配置不会产生实际效果。
2. kotlinOptions.jvmTarget配置的作用
jvmTarget仅对Kotlin代码的编译生效:
- 它指定Kotlin编译器输出的字节码兼容的JVM版本,设置为11时,Kotlin代码编译出的class只能运行在JDK 11及以上版本
- 你提到的「jvmTarget用于指定使用的标准库版本」的认知不准确:jvmTarget不直接绑定Kotlin标准库的版本,仅约束字节码的兼容级别。Kotlin标准库的版本由项目依赖的
kotlin-stdlib版本决定,仅当jvmTarget设置的版本低于标准库要求的最低JVM版本时,才会触发编译报错。
如果项目包含Kotlin测试代码,需要同步配置
compileTestKotlin块的kotlinOptions.jvmTarget,避免测试代码和主代码的字节码版本不一致。也可以通过全局配置统一所有Kotlin编译任务的参数:tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinOptions { jvmTarget = "11" } }
3. 最佳实践
如果要让项目所有产物的字节码版本完全统一,推荐同时配置两类参数:
java { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinOptions.jvmTarget = "11" }
内容的提问来源于stack exchange,提问作者Beamie
相关产品推荐
相关产品推荐

