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

时间:2016-12-13 03:27:19

标签: 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" } }

9 个答案:

答案 0 :(得分:33)

正如Mark在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

答案 1 :(得分:27)

Grader中的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"
    }
}

答案 2 :(得分:24)

如果有人使用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"
}

答案 3 :(得分:6)

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支持的讨论。

答案 4 :(得分:2)

对于像我这样使用maven在intellij中构建kotlin和java的混合代码的人,你需要设置

<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>

因为maven构建不尊重项目设置中设置的jvmTarget。

答案 5 :(得分:1)

在您的build.gradle.kts中:

    tasks {
        val java = "11"

        compileKotlin { 
           kotlinOptions { jvmTarget = java }
           sourceCompatibility = java
        }
    }

或者这样:

tasks {
    withType<KotlinCompile> { kotlinOptions { jvmTarget = "11" } }
}

答案 6 :(得分:0)

thean表示seanf的答案,但是如果您的DSL kotlin是1.3.0:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java).all {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

答案 7 :(得分:0)

// Apply for all modules

// Kotlin gradle script
tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString()
}

//Groovy
tasks.withType(KotlinCompile) {
    kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8
}

答案 8 :(得分:0)

如果遇到这样的错误: 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"
    }
}