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?

alisabzevari
źródło
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()
}
Jairo Lozano
źródło
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.

alisabzevari
źródło
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

Antal Attila
źródło
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.

Karol Kulbaka
źródło
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"
    }
 }
Sivakumar Ramadas
źródło
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ć

Zoe
źródło
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.

Tim Keating
źródło
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()
Ayush
źródło
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.

dastan
źródło