在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的回答中指出的那样,你必须同时配置compileKotlin
和compileTestKotlin
.你可以这样做而不重复:
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
kotlinOptions {
jvmTarget = "1.8"
}
}
Run Code Online (Sandbox Code Playgroud)
对于纯粹的Kotlin项目,我不认为选项sourceCompatibility
和targetCompatibility
做任何事情,所以你可以删除它们.
参考:https://kotlinlang.org/docs/reference/using-gradle.html#compiler-options
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)
小智 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)
Kotlin 1.0总是生成Java 6类文件.Kotlin 1.1将支持通过传递-jvm-target 1.8
给编译器来生成Java 8类文件.看到
讨论Java 7/8支持.
从 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。
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)
在您的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)
归档时间: |
|
查看次数: |
17465 次 |
最近记录: |