web-dev-qa-db-ja.com

GradleプロジェクトでKotlinのバイトコードバージョンをJava 8に設定するには?

Kotlinプロジェクトでは、クラスがバイトコードver 52(Java 8)にコンパイルされるようにするための適切なGradleスクリプトとは何ですか?

何らかの理由で、ソースとターゲットの互換性を設定しても、クラスは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" } }
37
wst

Debopの答えでマークが指摘したように、compileKotlincompileTestKotlinの両方を設定する必要があります。この方法で重複することなくそれを行うことができます:

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

純粋なKotlinプロジェクトの場合、オプションsourceCompatibilitytargetCompatibilityは何もしないと思うので、それらを削除できるかもしれません。

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

42
seanf

誰かがgroovyの代わりにkotlin-dslでgradleを使用する場合:

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

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

GradleのKotlin 1.1。コンソールでは、inline(インストールされているコンパイラは1.0.xです)に関するエラーがあります。IntelliJIDEAでgradleタスクを実行すると、kotlin 1.1コンパイラによってコンパイルされたコード

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

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

Kotlin 1.0は常にJava 6クラスファイルを生成します。 Kotlin 1.1は、-jvm-target 1.8をコンパイラに渡すことにより、Java 8クラスファイルの生成をサポートします。見る

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

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

Mavenを使用してkotlinとJavaの混合コードをビルドする私のような人は、設定する必要があります

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

mavenビルドはプロジェクト設定で設定されたjvmTargetを尊重しないためです。

2
happy15

seanfのanwserのthxですが、DSL kotlinが1.3.0の場合:

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