如何将 Gradle 项目中 Kotlin 的字节码版本设置为 Java 8?
Posted
技术标签:
【中文标题】如何将 Gradle 项目中 Kotlin 的字节码版本设置为 Java 8?【英文标题】:How to set up Kotlin's byte code version in Gradle project to Java 8? 【发布时间】:2017-04-28 01:14:35 【问题描述】:在 Kotlin 项目中,什么是正确的 Gradle 脚本以确保我的类将被编译为字节码版本 52 (Java 8)?
出于某种原因,即使我设置了源和目标兼容性,我的类仍被编译为版本 50 (Java 6)。至少这是我在构建项目后从目录build/classes/...
打开文件时向我展示的内容。
我目前的设置是这样的。
buildscript
ext
kotlinVersion = '1.0.5-2'
springBootVersion = '1.4.2.RELEASE'
repositories mavenCentral()
dependencies
classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
apply plugin: 'kotlin'
apply plugin: 'org.springframework.boot'
tasks.withType(JavaCompile)
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
## I also tried this and it hasn't helped
#sourceCompatibility = 1.8
#targetCompatibility = 1.8
repositories mavenCentral()
dependencies
compile("org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion")
compile('org.springframework.cloud:spring-cloud-starter-stream-rabbit')
dependencyManagement imports mavenBom "org.springframework.cloud:spring-cloud-dependencies:Camden.SR2"
【问题讨论】:
【参考方案1】:Kotlin 1.0 总是生成 Java 6 类文件。 Kotlin 1.1 将支持通过将 -jvm-target 1.8
传递给编译器来生成 Java 8 类文件。见
https://blog.jetbrains.com/kotlin/2016/07/first-glimpse-of-kotlin-1-1-coroutines-type-aliases-and-more/
关于 Java 7/8 支持的讨论。
【讨论】:
【参考方案2】:Gradle 中的 Kotlin 1.1。在控制台中,您有关于 inline
的错误(您安装的编译器是 1.0.x)
如果在 IntelliJ IDEA 中运行 gradle 任务,你的代码由 kotlin 1.1 编译器编译
compileKotlin
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
kotlinOptions
jvmTarget = "1.8"
apiVersion = "1.1"
languageVersion = "1.1"
【讨论】:
看起来您可能需要在 compileTestKotlin 块中复制它,才能将此配置应用于测试代码。不过,如果我对此有误,我想知道它以及为什么。 你是对的。那是因为这只是配置compileKotlin
任务。最好将所有任务配置为 KotlinCompile
类型,以确保将编译 Kotlin 的任何现有或添加的任务配置为使用所需的 Java 版本。【参考方案3】:
对于像我这样使用maven在intellij中构建kotlin和java混合代码的人,你需要设置
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
因为 maven 构建不尊重项目设置中设置的 jvmTarget。
【讨论】:
应该在哪个文件中设置? 在你的 Pom.xml 中,属性标签下。【参考方案4】:正如马克在 Debop 的回答中指出的那样,您必须同时配置 compileKotlin
和 compileTestKotlin
。您可以通过这种方式做到不重复:
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all
kotlinOptions
jvmTarget = "1.8"
对于纯 Kotlin 项目,我认为选项 sourceCompatibility
和 targetCompatibility
没有任何作用,因此您可以删除它们。
参考:https://kotlinlang.org/docs/reference/using-gradle.html#compiler-options
【讨论】:
知道如何使用 Kotlin DSL 为compileKotlin
和 compileTestKotlin
配置不同的 jvmTargets 吗?
我会这样做:org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java
@seanf 你知道在 gradle 中扩展 kotlinCompile
任务的方法吗?我想写我自己的kotlinCompile
任务
仅供参考,不要使用 all
使用 configureEach
这是避免任务的首选方式,并且会加快大型项目的配置阶段【参考方案5】:
如果有人使用带有 kotlin-dsl 而不是 groovy 的 gradle:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
// compile bytecode to java 8 (default is java 6)
tasks.withType<KotlinCompile>
kotlinOptions.jvmTarget = "1.8"
【讨论】:
我怎样才能为compileTestKotlin
实现同样的目标?
@jivimberg compileTestKotlin
也是KotlinCompile
类型,所以tasks.withType
块将配置项目中的所有KotlinCompile
任务。
我认为这对@mkobit 都适用
一行同解:tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> kotlinOptions.jvmTarget = "1.8"
【参考方案6】:
感谢 seanf 的 anwser,但如果你的 DSL kotlin 是 1.3.0:
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java).all
kotlinOptions
jvmTarget = "1.8"
【讨论】:
kotlin-dsl
已经在***.com/a/45994990/627727得到更好的语法回答【参考方案7】:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
// JVM target applied to all Kotlin tasks across all subprojects
// Kotlin DSL
tasks.withType<KotlinCompile>
kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString()
//Groovy
tasks.withType(KotlinCompile)
kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8
【讨论】:
感谢您的发帖,但您的回答如何改善其他人?已经提供的答案中是否缺少任何内容? 这是使用 const 并提供最惯用的解决方案的少数答案的组合 - 理想的做法【参考方案8】:在你的build.gradle.kts
:
tasks
val java = "11"
compileKotlin
kotlinOptions jvmTarget = java
sourceCompatibility = java
或者像这样:
tasks
withType<KotlinCompile> kotlinOptions jvmTarget = "11"
【讨论】:
为了使测试正常工作,我还必须添加一个compileTestKotlin
块,并且具有相同的值。【参考方案9】:
如果您遇到如下错误:
Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper '-jvm-target' option
.
然后,您可以简单地在build.gradle
(在 Groovy 中)中添加以下内容,以便告诉 kotlin 使用 1.8 构建。
compileKotlin
kotlinOptions
jvmTarget = "1.8"
【讨论】:
以上是关于如何将 Gradle 项目中 Kotlin 的字节码版本设置为 Java 8?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 kotlin 类添加到 gradle JavaCompile 任务
如何在intelliJ IDEA中为我现有的Kotlin项目生成build.gradle文件
在 Kotlin 1.3 多平台 gradle 项目中参考来自 kotlin-jvm 的 kotlin-js 资源
如何使用单个build.gradle配置向kotlin多平台项目添加依赖项