如何在Gradle项目中将Kotlin的字节码版本设置为Java 8?

wst*_*wst 41 gradle kotlin

在Kotlin项目中,什么是正确的Gradle脚本以确保我的类将被编译为字节码52(Java 8)?

出于某种原因,即使我设置了源和目标兼容性,我的类也编译为ver 50(Java 6).至少这是Idea 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" } }
Run Code Online (Sandbox Code Playgroud)

sea*_*anf 48

正如Mark在Debop的回答中指出的那样,你必须同时配置compileKotlincompileTestKotlin.你可以这样做而不重复:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
  kotlinOptions {
    jvmTarget = "1.8"
  }
}
Run Code Online (Sandbox Code Playgroud)

对于纯粹的Kotlin项目,我不认为选项sourceCompatibilitytargetCompatibility做任何事情,所以你可以删除它们.

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

  • 知道如何使用 Kotlin DSL 为 `compileKotlin` 和 `compileTestKotlin` 配置不同的 jvmTargets 吗? (3认同)
  • 我会这样做:`org.jetbrains.kotlin.gradle.tasks.KotlinCompile :: class.java` (2认同)

gue*_*ter 34

如果有人使用gradle与kotlin-dsl而不是groovy:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

// compile bytecode to java 8 (default is java 6)
tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}
Run Code Online (Sandbox Code Playgroud)

  • 如何为`compileTestKotlin`实现相同的目标? (6认同)
  • 一行中的相同解决方案:`tasks.withType&lt;org.jetbrains.kotlin.gradle.tasks.KotlinCompile&gt; { kotlinOptions.jvmTarget = "1.8" }` (2认同)

小智 31

Kotlin 1.1 in Gradle.在控制台中你有错误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"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 看起来您可能需要在compileTestKotlin块中复制它以将此配置应用于测试代码.如果我对此错了,我想了解它以及为什么. (5认同)

Ing*_*gel 7

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支持.


hen*_*nnr 7

从 gradle 6.7 开始,gradle 中有所谓的java 工具链支持,我发现它最容易使用。

它允许您配置用于该项目的 JDK,甚至可以根据需要下载所需的版本。

您所需要的只是一个兼容的 JRE 来启动 gradle 以及 gradle 构建文件中的此块:

科特林DSL

kotlin {
    jvmToolchain {
        // for gradle kotlin plugin < 1.7:
        (this as JavaToolchainSpec).languageVersion.set(JavaLanguageVersion.of(17))
        // for gradle kotlin plugin >= 1.7:
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}
Run Code Online (Sandbox Code Playgroud)

常规DSL

kotlin {
    jvmToolchain {
        languageVersion.set(JavaLanguageVersion.of(17))
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:这也会更新 java 编译器设置,因此您不需要在 build.gradle.kts 中添加任何其他内容

在文档中阅读有关此内容的更多信息:

https://kotlinlang.org/docs/gradle.html#set-custom-jdk-home

https://docs.gradle.org/current/userguide/toolchains.html

另请注意,如果您也想使用此功能,则需要引入插件来下载 JDK。


Igo*_*jda 5

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
}
Run Code Online (Sandbox Code Playgroud)


Dmi*_*ich 5

在您的build.gradle.kts

    tasks {
        val java = "11"

        compileKotlin { 
           kotlinOptions { jvmTarget = java }
           sourceCompatibility = java
        }
    }
Run Code Online (Sandbox Code Playgroud)

或者像这样:

tasks {
    withType<KotlinCompile> { kotlinOptions { jvmTarget = "11" } }
}
Run Code Online (Sandbox Code Playgroud)