81 votes

Comment configurer la version de code octet de Kotlin dans le projet Gradle en Java 8?

Dans le projet Kotlin, qu'est-ce qu'un bon script Gradle pour m'assurer que mes classes seront compilées en octet code ver 52 (Java 8)?

Pour une raison quelconque, mes classes sont compilées en tant que ver 50 (Java 6) même si j'ai configuré la compatibilité source et cible. C'est du moins ce que Idea me montre lorsque j'ouvre un fichier du répertoire build/classes/... après la construction du projet.

Ma configuration actuelle ressemble à ceci.

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

107voto

seanf Points 1698

Comme Mark l'a souligné sur Debop réponse, vous devez configurer compileKotlin et compileTestKotlin. Vous pouvez le faire sans duplication de cette façon:

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

Pour un pur Kotlin projet, je ne pense pas que les options sourceCompatibility et targetCompatibility faire quoi que ce soit, de sorte que vous pouvez être en mesure de les éliminer.

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

76voto

guenhter Points 4460

Dans le cas où quelqu'un utilise gradle avec kotlin-dsl au lieu de groovy:

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

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

40voto

Debop Points 606

Kotlin 1.1 à Gradle. dans la console, vous avez une erreur sur inline (votre compilateur installé est 1.0.x) Si vous exécutez la tâche gradle dans IntelliJ IDEA, votre code compilé par le compilateur kotlin 1.1

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

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

7voto

Ingo Kegel Points 13858

Kotlin 1.0 produit toujours des fichiers de classe Java 6. Kotlin 1.1 prend en charge la génération de fichiers de classe Java 8 en transmettant -jvm-target 1.8 au compilateur. Voir

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

pour une discussion sur la prise en charge de Java 7/8.

1voto

happy15 Points 71

Pour toute personne comme moi qui utilise maven pour construire du code mixte de kotlin et java dans intellij, vous devez définir

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

car la construction de maven ne respecte pas jvmTarget défini dans le cadre du projet

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X