Как настроить версию байтового кода Kotlin в проекте Gradle на Java 8?
В проекте Kotlin, что является правильным Gradle script, чтобы убедиться, что мои классы будут скомпилированы в байтовый код ver 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" } }
Ответы
Ответ 1
Как отметил Марк на ответе 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
Ответ 2
Kotlin 1.1 in Gradle. в консоли у вас есть ошибка о inline
(ваш установленный компилятор равен 1.0.x)
Если запустить задачу gradle в IntelliJ IDEA, ваш код, скомпилированный компилятором kotlin 1.1
compileKotlin {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
kotlinOptions {
jvmTarget = "1.8"
apiVersion = "1.1"
languageVersion = "1.1"
}
}
Ответ 3
Если кто-то использует 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"
}
Ответ 4
Kotlin 1.0 всегда создает файлы классов Java 6. Kotlin 1.1 будет поддерживать генерацию файлов класса Java 8, передав -jvm-target 1.8
компилятору. См
https://blog.jetbrains.com/kotlin/2016/07/first-glimpse-of-kotlin-1-1-coroutines-type-aliases-and-more/
для обсуждения поддержки Java 7/8.
Ответ 5
Для таких, как я, которые используют maven для создания смешанного кода kotlin и java в intellij, вам нужно установить
<kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
потому что maven build не учитывает jvmTarget, установленный в настройках проекта.
Ответ 6
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
// 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
}
Ответ 7
спасибо за seanf anwser, но если ваш DSL kotlin равен 1.3.0:
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile::class.java).all {
kotlinOptions {
jvmTarget = "1.8"
}
}