Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何设置Kotlin';Gradle项目中的s字节码版本到Java 8?_Gradle_Kotlin - Fatal编程技术网

如何设置Kotlin';Gradle项目中的s字节码版本到Java 8?

如何设置Kotlin';Gradle项目中的s字节码版本到Java 8?,gradle,kotlin,Gradle,Kotlin,在Kotlin项目中,什么是合适的Gradle脚本来确保我的类将被编译成字节码Ver52(Java8) 出于某种原因,尽管我设置了源代码和目标代码的兼容性,我的类还是编译为Ver50(Java6)。至少当我在构建项目后从目录build/classes/…打开文件时,Idea向我展示了这一点 我当前的设置如下所示 buildscript { ext { kotlinVersion = '1.0.5-2' springBootVersion = '1.4.2.

在Kotlin项目中,什么是合适的Gradle脚本来确保我的类将被编译成字节码Ver52(Java8)

出于某种原因,尽管我设置了源代码和目标代码的兼容性,我的类还是编译为Ver50(Java6)。至少当我在构建项目后从目录
build/classes/…
打开文件时,Idea向我展示了这一点

我当前的设置如下所示

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" } }

Kotlin1.0总是生成Java6类文件。Kotlin 1.1将通过向编译器传递
-jvm目标1.8
来支持生成Java 8类文件。看


有关Java 7/8支持的讨论。

Gradle中的Kotlin 1.1。在控制台中,您有关于
内联
的错误(您安装的编译器是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"
    }
}

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

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

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

正如Mark在Debop的回答中指出的,您必须同时配置
compileKotlin
compileTestKotlin
。您可以这样做,而无需重复:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.kotlincomfile)。所有{
科特洛普斯酒店{
jvmTarget=“1.8”
}
}
对于纯Kotlin项目,我认为
sourceCompatibility
targetCompatibility
选项没有任何作用,因此您可以删除它们


参考:

如果有人将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"
}
import org.jetbrains.kotlin.gradle.tasks.kotlincomfile
//将字节码编译为Java8(默认值为Java6)
tasks.withType{
kotlinOptions.jvmTarget=“1.8”
}

thx用于seanf的anwser,但如果您的DSL kotlin为1.3.0:

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java).all {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
import org.jetbrains.kotlin.gradle.tasks.kotlincomfile
//JVM目标应用于所有子项目中的所有Kotlin任务
//科特林DSL
tasks.withType{
kotlinOptions.jvmTarget=JavaVersion.VERSION_1_8.toString()
}
//棒极了
tasks.withType(KotlUncompile){
kotlinOptions.jvmTarget=JavaVersion.VERSION_1_8
}

在您的
build.gradle.kts
中:

    tasks {
        val java = "11"

        compileKotlin { 
           kotlinOptions { jvmTarget = java }
           sourceCompatibility = java
        }
    }
或者像这样:

tasks {
    withType<KotlinCompile> { kotlinOptions { jvmTarget = "11" } }
}
任务{
使用类型{kotlinOptions{jvmTarget=“11”}
}

如果您遇到如下错误:
无法将使用JVM目标1.8构建的字节码内联到使用JVM目标1.6构建的字节码中。请指定正确的“-jvm目标”选项

然后,您可以简单地在
build.gradle
(Groovy中)中添加以下内容,以便告诉kotlin使用1.8进行构建

compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

看起来您可能需要在compileTestKotlin块中复制此配置,才能将此配置应用于测试代码。但是,如果我错了,我想知道为什么。应该在哪个文件中设置它?在Pom.xml中,在properties标签下。知道如何使用Kotlin DSL为
compileKotlin
compileTestKotlin
配置不同的JVM目标吗?我会这样做:
org.jetbrains.Kotlin.gradle.tasks.KotlinCompile::class.java
@seanf你知道在gradle中扩展
KotlinCompile
任务的方法吗?我想写我自己的
kotlincompiletestkotlin
任务如何才能为
compileTestKotlin
实现同样的目标?@jivimberg
compileTestKotlin
也是
kotlinCompile
类型,因此,
tasks.withType
块将配置项目中的所有
KotlinCompile
任务。我认为这对@mkobitt两个任务都是这样的:
tasks.withType{kotlinOptions.jvmTarget=“1.8”}
kotlin dsl
在感谢发帖时已经得到了更好的语法回答,但是您的回答如何改进了其他人?它是否有一些已经提供的答案中缺少的东西?这是使用常量的少数答案的组合,并提供了最惯用的解决方案-理想的测试方法。为了使测试正常工作,我还必须添加一个具有相同值的
compileTestKotlin
块。
compileKotlin {
    kotlinOptions {
        jvmTarget = "1.8"
    }
}