如何将 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 的回答中指出的那样,您必须同时配置 compileKotlincompileTestKotlin。您可以通过这种方式做到不重复:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all 
  kotlinOptions 
    jvmTarget = "1.8"
  

对于纯 Kotlin 项目,我认为选项 sourceCompatibilitytargetCompatibility 没有任何作用,因此您可以删除它们。

参考:https://kotlinlang.org/docs/reference/using-gradle.html#compiler-options

【讨论】:

知道如何使用 Kotlin DSL 为 compileKotlincompileTestKotlin 配置不同的 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&lt;org.jetbrains.kotlin.gradle.tasks.KotlinCompile&gt; 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多平台项目添加依赖项

如何将Groovy gradle任务重写为Kotlin gradle脚本

如何将字节从 Swift (iOS) 传递到 Kotlin 通用模块?