webentwicklung-frage-antwort-db.com.de

Wie kann man die Byte-Code-Version von Kotlin in Gradle-Projekt auf Java 8 einrichten?

Was ist im Kotlin-Projekt ein richtiges Gradle-Skript, um sicherzustellen, dass meine Klassen zu Byte-Code ver 52 (Java 8) kompiliert werden?

Aus irgendeinem Grund werden meine Klassen als Version 50 (Java 6) kompiliert, obwohl ich Quell- und Zielkompatibilität eingerichtet habe. Zumindest zeigt mir Idea, wenn ich nach dem Erstellen des Projekts eine Datei aus dem Verzeichnis build/classes/... öffne.

Mein aktuelles Setup sieht so aus.

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

Wie Mark in Debops Antwort darauf hingewiesen hat, müssen Sie sowohl compileKotlin als auch compileTestKotlin konfigurieren. Sie können dies ohne Duplizierung auf diese Weise tun:

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

Bei einem reinen Kotlin-Projekt glaube ich nicht, dass die Optionen sourceCompatibility und targetCompatibility irgendetwas tun, sodass Sie sie möglicherweise entfernen können.

Ref: https://kotlinlang.org/docs/reference/using-gradle.html#compiler-options

31
seanf

Kotlin 1.1 in Gradle. In der Konsole haben Sie einen Fehler bezüglich inline (Ihr installierter Compiler ist 1.0.x) Wenn Sie die Gradle-Task in IntelliJ IDEA ausführen, wird Ihr Code von einem Kotlin 1.1-Compiler kompiliert

compileKotlin {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8

    kotlinOptions {
        jvmTarget = "1.8"
        apiVersion = "1.1"
        languageVersion = "1.1"
    }
}
26
Debop

Falls jemand gradle mit kotlin-dsl anstatt groovy verwendet:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

// compile bytecode to Java 8 (default is Java 6)
tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}
22
guenhter

Kotlin 1.0 erzeugt immer Java 6-Klassendateien. Kotlin 1.1 unterstützt die Generierung von Java 8-Klassendateien, indem -jvm-target 1.8 an den Compiler übergeben wird. Sehen

https://blog.jetbrains.com/kotlin/2016/07/first-glimpse-of-kotlin-1-1-coroutines-type-aliases-and-more/

für eine Erläuterung der Unterstützung von Java 7/8.

6
Ingo Kegel
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
}
4
Igor Wojda

Für jeden wie mich, der maven verwendet, um in Intellij gemischten Code aus Kotlin und Java zu erstellen, müssen Sie festlegen 

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

weil maven build jvmTarget nicht berücksichtigt, das in den Projekteinstellungen festgelegt ist.

2
happy15

thx für seanfs anwser, aber wenn dein DSL kotlin 1.3.0 ist: 

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