Warum kann das Kotlin Gradle Plugin nicht mit 1.8 Target erstellt werden?

85

Ich habe das einfachste Gradle-Projekt mit Intellij für Kotlin 1.2.10 konfiguriert. Hier ist meine build.gradle-Datei:

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

Und ich habe eine einfache Java-Oberfläche:

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

Wenn ich diese Schnittstelle importiere und versuche, die myAbsMethode aufzurufen , schlägt dies mit folgendem Fehler fehl:

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

Ich habe eine Intellij Kotlin App erstellt und sie hat korrekt funktioniert. Ist es ein Fehler im neuen Kotlin Gradle Plugin?

alisabzevari
quelle
Haben Sie JDK 8?
Zoe
Ja, und dieses Problem tritt nur auf, wenn ich das Projekt in Intellij erstelle. Gradle im Terminal funktioniert gut!
Alisabzevari
Was ist die IDE-Plugin-Version, die Sie verwenden? Ich konnte den Fehler mit dem 1.2.21 Plugin nicht reproduzieren. Wenn dies auch bei den neueren Versionen des Gradle & IDE-Plugins der Fall ist , können Sie ein Problem unter kotl.in/issue einreichen und die genauen Schritte beschreiben, die zu dem Fehler führen.
Hotkey

Antworten:

172

Ich denke, dies könnte für diejenigen hilfreich sein, die Android Studio 3.2 auf einem Mac verwenden.

Um die Kotlin Compiler Target JVM-Version zu ändern, gehen Sie zu Android Studio -> Einstellungen -> Kotlin Compiler und ändern Sie dann die Target JVM-Version, indem Sie aus der Dropdown-Liste auswählen.

Wie auch immer, ich erhalte immer noch den folgenden Fehler

Aufrufe statischer Methoden in Java-Schnittstellen sind in JVM-Ziel 1.6 verboten. Neu kompilieren mit '-jvm-target 1.8'

Gelöst

Das Hinzufügen von Folgendem zu meinem build.gradle löste das Problem:

android {
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

Informationen zu dieser und anderen Gradle-Konfigurationsoptionen: https://kotlinlang.org/docs/reference/using-gradle.html


Mit Kotlin Gradle DSL:

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

(kotlinOptions as KotlinJvmOptions).apply {
    jvmTarget = JavaVersion.VERSION_1_8.toString()
}
Jairo Lozano
quelle
20
Für Android-Projekte muss die Ziel-JVM-Version des Kotlin-Compilers in build.gradle geändert werden, nicht in den Android Studio-Einstellungen. Änderungen in den Android Studio-Einstellungen wirken sich nicht auf Befehlszeilen-Builds aus.
Yole
1
Vielen Dank für diese, große Hilfe @yole
Curyous
Vielen Dank für diese, große Hilfe,
Lotosbin
2
Cool, es hilft! Und es ist appübrigens gradle.
Wesely
2
Ist es möglich, dies in der Root-Datei build.gradle festzulegen? Es ist mühsam, dies modulübergreifend in einem Projekt mit mehreren Modulen zu verwalten.
Robotsquidward
70

Es stellte sich heraus, dass es sich um meine Kotlin-Compiler-Konfiguration in den Intellij-Einstellungen handelte. In Settings > Build, Execution, Deployment > Compiler > Kotlin Compilereiner Einstellung Target JVM versionsollte aufgerufen auf 1.8 gesetzt worden sein.

alisabzevari
quelle
3
In meiner Version ist es inSettings -> Other Settings -> Kotlin Compiler -> Target JVM Version
ElyashivLavi
6
Aber selbst wenn auf 1.8 gesetzt, bekomme ich immer nochCalls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
ElyashivLavi
Ich habe nicht Other Settingsin meinem!
Alisabzevari
37
In meinem Fall behebe ich es inProject Structure -> Facets -> Kotling -> Target Platform
Pablo Bastidas
Eigentlich habe ich alle oben genannten und keine Nachricht mehr ... noch nicht. IJ 2018.1.5 Kotlin 1.2.50.
Softjake
20

Bitte überprüfen Sie, ob Sie die folgenden drei Dinge in der Idee haben:

  1. Kotlin-Optionen in build.gradle
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. Überprüfen Sie die relevanten Ideeneinstellungen Einstellungen

  2. Überprüfen Sie die Projektfacetten Geben Sie hier die Bildbeschreibung ein

Antal Attila
quelle
13

Es gibt eine Gradle-Eigenschaft, die vom Kotlin-Plugin verwendet wird und verwendet werden kann. Wenn Sie hinzufügen

kotlin.setJvmTargetFromAndroidCompileOptions = true

zu Ihrer gradle.propertiesDatei. Wenn Sie diese Konfiguration auf Ihrem habenbuild.config

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

Problem sollte gelöst werden.

Karol Kulbaka
quelle
Das Projekt, an dem ich arbeitete, hatte sourceCompatibility & targetCompatibilitykonfiguriert, aber das Hinzufügen kotlin.setJvmTargetFromAndroidCompileOptions = truelöste das Problem für mich
Fdo
1

Ich bin mir nicht ganz sicher, warum dies funktioniert, aber Sie können versuchen, die Einstellung in der Idee selbst zu ändern. Da Gradle über die Befehlszeile funktioniert, aber nicht beim Erstellen aus IntelliJ, ist dies wahrscheinlich die Wurzel.

Gehen Sie zu Datei -> Projektstruktur. Wechseln Sie zur Registerkarte Projekt, stellen Sie sicher, dass Project SDK 8 (oder neuer) ist, und setzen Sie Project language levelJava 8

Geben Sie hier die Bildbeschreibung ein

Die Konfiguration dort scheint Gradle aus irgendeinem Grund zu überschreiben, daher sollte das Ändern funktionieren

Zoe
quelle
Es ist 8 in meiner Intelligenz!
Alisabzevari
Versuchen Sie, die Caches ungültig zu machen und neu zu starten
Zoe
Hat nicht funktioniert. Ich habe ein Projekt mit älteren Intellij erstellt (aktuell ist 2017.3.4). Der alte arbeitet. Ich vergleiche .idea-Ordner von zwei Projekten miteinander. Macht das Sinn?
Alisabzevari
2
Ich hatte den gleichen Fehler bei einem Maven-Projekt. Es wurde gerade das Hinzufügen von <kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget> zum Eigenschaftenabschnitt behoben. Werfen Sie einen Blick hier youtrack.jetbrains.com/issue/KT-17492 für weitere Informationen
Paolo
Die Einstellung "Projektsprachenebene" steuert, wie Java-Quellcode in der IDE hervorgehoben wird. Es hat keinerlei Einfluss auf die Kotlin-Kompilierung.
Yole
1

Dies wird auch in den Projekteinstellungen unter festgelegt Project Settings > Modules > Kotlin. Dies war mein spezifisches Problem ... buchstäblich das Letzte, was ich versucht habe.

Tim Keating
quelle
1

// Fügen Sie einfach den folgenden Code in Ihren Build-Gradle ein (Modul: App)

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

In meinem Fall habe ich alle @ alisabzevari-Optionen ausprobiert, einschließlich der im Kommentar angegebenen, aber es hat nicht funktioniert.

Mein Fehler Ich habe Java-Datei auch im src/<sourcset_name>kotlin/Ordner hinzugefügt , später habe ich Java-Datei in Kotlin-Datei konvertiert. und Voila! Es klappt.

Vielleicht hilft es jemandem.

Dastan
quelle
0

Das hat bei mir in Gradle mit Kotlin DSL funktioniert:

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