Dlaczego wtyczka Kotlin Gradle nie może budować z celem 1.8?


93

Mam najprostszy projekt gradle skonfigurowany przy użyciu intellij dla kotlin 1.2.10. Oto mój plik 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"
}

Mam prosty interfejs java:

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

Kiedy importuję ten interfejs i próbuję wywołać myAbsmetodę, kończy się to błędem:

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

Stworzyłem aplikację intellij kotlin i działała poprawnie. Czy to błąd w nowej wtyczce Kotlin Gradle?


Czy masz JDK 8?
Zoe

Tak, a ten problem występuje tylko wtedy, gdy buduję projekt w intellij. gradle w terminalu działa dobrze!
alisabzevari

Jaka jest wersja wtyczki IDE, której używasz? Nie mogłem odtworzyć błędu z wtyczką 1.2.21. Jeśli tak się stanie z nowszymi wersjami wtyczek Gradle i IDE, możesz zgłosić problem na stronie kotl.in/issue i opisać dokładne kroki, które doprowadziły do ​​błędu.
skrót klawiszowy

Odpowiedzi:


179

Myślę, że może to być pomocne dla osób używających Android Studio 3.2 na Macu.

Aby zmienić docelową wersję JVM kompilatora Kotlin, należy przejść do Android Studio -> Preferencje -> Kompilator Kotlin, a następnie zmienić docelową wersję JVM, wybierając z menu rozwijanego.

W każdym razie nadal otrzymuję następujący błąd

Wywołania metod statycznych w interfejsach Java są zabronione w JVM target 1.6. Przekompiluj z „-jvm-target 1.8”

ROZWIĄZANY

Dodanie następującego pliku do pliku build.gradle rozwiązało problem:

android {
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

Informacje o tej i innych opcjach konfiguracji Gradle: https://kotlinlang.org/docs/reference/using-gradle.html


Z Kotlin Gradle DSL:

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

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

20
W przypadku projektów dla systemu Android docelowa wersja JVM kompilatora Kotlin musi zostać zmieniona w pliku build.gradle, a nie w preferencjach Android Studio. Zmiany w preferencjach Android Studio nie wpłyną na kompilacje wiersza poleceń.
yole

1
Dzięki za to, wielka pomoc @yole
Curyous

Dzięki za to, wielka pomoc,
lotosbin,

2
Fajnie, to pomaga! A tak przy appokazji, to jest gradle.
Wesely

2
Czy można to ustawić w głównym pliku build.gradle? Zarządzanie tym między modułami w projekcie wielomodułowym jest żmudne.
robotsquidward

75

Okazało się, że to moja konfiguracja kompilatora kotlin w ustawieniach intellij. W Settings > Build, Execution, Deployment > Compiler > Kotlin Compilerwywołanym ustawieniu Target JVM versionpowinien być ustawiony na 1,8.


3
W mojej wersji jest toSettings -> Other Settings -> Kotlin Compiler -> Target JVM Version
ElyashivLavi

6
Ale nawet po ustawieniu na 1,8 nadal otrzymujęCalls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
ElyashivLavi,

Nie mam Other Settingsw swoim!
alisabzevari

38
W moim przypadku naprawiam to wProject Structure -> Facets -> Kotling -> Target Platform
Pablo Bastidas

Właściwie, ustawiłem wszystkie powyższe i nie ma więcej wiadomości ... jeszcze. IJ 2018.1.5 Kotlin 1.2.50.
softjake

21

Sprawdź, czy masz pomysł na następujące trzy rzeczy:

  1. Opcje kotlin w build.gradle
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. Sprawdź odpowiednie preferencje pomysłów Preferencje

  2. Sprawdź aspekty projektu wprowadź opis obrazu tutaj


16

Istnieje właściwość gradle używana przez wtyczkę Kotlin, której można użyć. Kiedy dodasz

kotlin.setJvmTargetFromAndroidCompileOptions = true

do twojego gradle.propertiespliku. Gdy masz taką konfigurację na swoimbuild.config

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

problem powinien zostać rozwiązany.


Projekt pracowałem na miał sourceCompatibility i targetCompatibilityskonfigurowany ale dodanie kotlin.setJvmTargetFromAndroidCompileOptions = truerozwiązał problem dla mnie
FDO

6

// Po prostu dodaj poniższy kod w swoim Build gradle (Module: app)

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

1

Nie do końca wiem, dlaczego to działa, ale możesz spróbować zmienić ustawienie w samym Pomyśle. Ponieważ Gradle z wiersza poleceń działa, ale nie podczas budowania z IntelliJ, prawdopodobnie jest to katalog główny.

Przejdź do Plik -> Struktura projektu. Przejdź do zakładki Project i upewnij się, że Project SDK ma wersję 8 (lub nowszą) i ustaw Project language levelJava 8

wprowadź opis obrazu tutaj

Konfiguracja z jakiegoś powodu zdaje się zastępować Gradle, więc jej zmiana powinna działać


W moim intellij jest 8!
alisabzevari

Spróbuj unieważnić pamięci podręczne i zrestartować
Zoe,

Nie udało się. Mam projekt utworzony przy użyciu starszego intellij (obecny to 2017.3.4). Stary działa. Porównuję ze sobą foldery .idea dwóch projektów. Czy ma sens?
alisabzevari

2
Miałem ten sam błąd w projekcie maven. Właśnie rozwiązano dodanie <kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget> do sekcji właściwości. Zajrzyj tutaj youtrack.jetbrains.com/issue/KT-17492, aby uzyskać więcej informacji
Paolo

Ustawienie „Poziom języka projektu” kontroluje sposób podświetlania kodu źródłowego Java w środowisku IDE. Nie ma to żadnego wpływu na kompilację Kotlina.
yole

1

Można to również ustawić w ustawieniach projektu w sekcji Project Settings > Modules > Kotlin. To był mój konkretny problem ... dosłownie ostatnia rzecz, jakiej próbowałem.


1

To zadziałało dla mnie w Gradle z Kotlin DSL:

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

0

W moim przypadku wypróbowałem wszystkie opcje @alisabzevari, w tym podane w komentarzu, ale to nie zadziałało,

mój błąd dodałem plik java również w src/<sourcset_name>kotlin/folderze, później przekonwertowałem plik java na plik kotlin. i Voila! To działa.

Może to komuś pomoże.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.