kotlin gradleプラグインが1.8ターゲットでビルドできないのはなぜですか?


92

kotlin1.2.10用のintellijを使用して構成された最も単純なgradleプロジェクトがあります。これが私のbuild.gradleファイルです:

buildscript {
    ext.kotlin_version = '1.2.10'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

group 'com.ali'
version '1.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'kotlin'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    testCompile group: 'junit', name: 'junit', version: '4.12'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

そして、私は単純なJavaインターフェースを持っています:

public interface MyMath {
    static int myAbs(int input) {
        return Math.abs(input);
    }
}

このインターフェイスをインポートしてmyAbsメソッドを呼び出そうとすると、次のエラーで失敗します。

Error:(6, 12) Kotlin: Calls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'

intellij kotlinアプリを作成しましたが、正しく機能していました。新しいKotlingradleプラグインのバグですか?


JDK 8はありますか?
ゾーイ

はい。この問題は、プロジェクトをintellijでビルドした場合にのみ発生します。ターミナルのgradleは正常に動作します!
alisabzevari 2018

使用しているIDEプラグインのバージョンは何ですか?1.2.21プラグインでエラーを再現できませんでした。それが新しいGradle&IDEプラグインバージョンでも発生する場合は、kotl.in / issueで問題を報告し、エラーにつながる正確な手順を説明することができます。
ホットキー2018

回答:


178

これは、MacでAndroid Studio3.2を使用している人に役立つと思います。

KotlinコンパイラのターゲットJVMバージョンを変更するには、Android Studio->環境設定-> Kotlinコンパイラに移動し、ドロップダウンから選択してターゲットJVMバージョンを変更する必要があります。

とにかく、私はまだ次のエラーが発生しています

Javaインターフェースでの静的メソッドの呼び出しは、JVMターゲット1.6では禁止されています。'-jvm-target1.8'で再コンパイルします

解決済み

build.gradleに以下を追加すると、問題が解決しました。

android {
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

これと他のGradle構成オプションについて:https//kotlinlang.org/docs/reference/using-gradle.html


Kotlin Gradle DSLの場合:

import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions

(kotlinOptions as KotlinJvmOptions).apply {
    jvmTarget = JavaVersion.VERSION_1_8.toString()
}

20
Androidプロジェクトの場合、KotlinコンパイラのターゲットJVMバージョンは、Android Studioの設定ではなく、build.gradleで変更する必要があります。Android Studioの設定を変更しても、コマンドラインビルドには影響しません。
yole 2018

1
@yoleこのためおかげで、大きな助け
Curyous

これをありがとう、大きな助け、
lotosbin 2018

2
かっこいい、助かります!そして、それはapp's gradlebtwです。
ウェスリー

2
これをルートbuild.gradleファイルで設定することは可能ですか?マルチモジュールプロジェクトのモジュール間でこれを管理するのは面倒です。
robotsquidward

75

それはintellij設定での私のkotlinコンパイラ構成であることが判明しました。Settings > Build, Execution, Deployment > Compiler > Kotlin Compiler呼ばれる設定Target JVM version1.8に設定されている必要があります。


3
私のバージョンでは、次のようになっていますSettings -> Other Settings -> Kotlin Compiler -> Target JVM Version
ElyashivLavi 2018

6
しかし、1.8に設定した場合でも、次のようになりますCalls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
ElyashivLavi 2018

私は私の中にはありませんOther Settings
alisabzevari 2018

38
私の場合、私はそれを修正Project Structure -> Facets -> Kotling -> Target Platform
パブロBastidas

実際、私は上記のすべてを設定し、それ以上のメッセージはありません...まだ。IJ 2018.1.5 Kotlin1.2.50。
softjake

21

次の3つのアイデアが設定されているかどうかを確認してください。

  1. build.gradleのkotlinオプション
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. 関連するアイデアの設定を確認してください 環境設定

  2. プロジェクトファセットを確認してください ここに画像の説明を入力してください


15

Kotlinプラグインで使用できるgradleプロパティがあります。追加するとき

kotlin.setJvmTargetFromAndroidCompileOptions = true

あなたのgradle.propertiesファイルに。にこの構成がある場合build.config

android{
  compileOptions {
      sourceCompatibility = 1.8
      targetCompatibility = 1.8
  }
}

問題は解決されるはずです。


私が持っていたに取り組んでいたプロジェクトsourceCompatibility targetCompatibility設定されますが、追加することは、kotlin.setJvmTargetFromAndroidCompileOptions = true私にとっては、問題を解決
FDO

6

//以下のコードをビルドgradle(Module:app)に追加するだけです

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

1

これが機能する理由はよくわかりませんが、アイデア自体の設定を変更してみることができます。コマンドラインからのGradleは機能しますが、IntelliJからビルドする場合は機能しないため、これがおそらくルートです。

[ファイル]-> [プロジェクト構造]に移動します。[プロジェクト]タブに移動し、Project SDKが8(またはそれ以降)であることを確認し、Project language levelをJava8に設定します。

ここに画像の説明を入力してください

そこにある設定は何らかの理由でGradleをオーバーライドしているようですので、変更すると機能するはずです


私のインテリジでは8です!
alisabzevari 2018

キャッシュを無効にして再起動してみてください
Zoe

動作しませんでした。古いintellijで作成されたプロジェクトがあります(現在は2017.3.4です)。古いものは働いています。2つのプロジェクトの.ideaフォルダーを相互に比較しています。それは意味がありますか?
alisabzevari 2018

2
Mavenプロジェクトでも同じエラーが発生しました。プロパティセクションに<kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget>を追加することで解決しました。ここを見てみましょうyoutrack.jetbrains.com/issue/KT-17492の詳細は
パオロ・

「プロジェクト言語レベル」設定は、JavaソースコードがIDEでどのように強調表示されるかを制御します。Kotlinのコンパイルにはまったく影響しません。
yole 2018

1

これは、プロジェクト設定のの下にも設定されますProject Settings > Modules > Kotlin。これは私の特定の問題でした...文字通り私が試した最後のことです。


1

これは、KotlinDSLを使用したGradleで機能しました。

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions.jvmTarget = JavaVersion.VERSION_11.toString()

0

私の場合、コメントで与えられたものを含むすべての@alisabzevariオプションを試しましたが、機能しませんでした。

私の間違い私はJavaファイルも追加しました src/<sourcset_name>kotlin/フォルダに、後でJavaファイルをkotlinファイルに変換しました。と出来上がり!できます。

多分それは誰かを助けるでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.