Как настроить версию байтового кода 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"
}

Ответ 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"
    }
}