web-dev-qa-db-fra.com

Comment configurer la version du code d'octet de Kotlin dans le projet Gradle sur Java 8?

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

Pour une raison quelconque, mes classes sont compilées en tant que version 50 (Java 6) même si je configure la compatibilité source et cible. Au moins c'est ce que Idea me montre quand j'ouvre un fichier du répertoire build/classes/... après avoir construit le 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" } }
29
wst

Comme Mark l'a souligné dans la réponse de Debop, 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 projet Kotlin pur, je ne pense pas que les options sourceCompatibility et targetCompatibility servent à quelque chose que vous puissiez peut-être les supprimer.

Réf.: https://kotlinlang.org/docs/reference/using-gradle.html#compiler-options

31
seanf

Kotlin 1.1 dans Gradle. dans la console vous avez une erreur à propos de inline (votre compilateur installé est 1.0.x) Si vous exécutez une tâche de gradation 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"
    }
}
26
Debop

Si 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"
}
22
guenhter

Kotlin 1.0 produit toujours des fichiers de classe Java 6. Kotlin 1.1 prendra 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 le support de Java 7/8.

6
Ingo Kegel

Pour ceux qui comme moi utilisent maven pour construire un code mixte de kotlin et Java dans intellij, vous devez définir 

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

parce que maven build ne respecte pas jvmTarget défini dans les paramètres du projet.

2
happy15

merci pour la réponse de seanf, mais si votre kotlin DSL est 1.3.0: 

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