在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" } }
答案 0 :(得分:33)
正如Mark在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
答案 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类文件。参见
有关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"
}
}