Mengapa plugin gradle kotlin tidak dapat dibangun dengan target 1,8?

93

Saya memiliki proyek gradle paling sederhana yang dikonfigurasi menggunakan intellij untuk kotlin 1.2.10. Ini file build.gradle saya:

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

Dan saya memiliki antarmuka java yang sederhana:

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

Ketika saya mengimpor antarmuka ini dan mencoba memanggil myAbsmetode itu gagal dengan kesalahan ini:

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

Saya telah membuat aplikasi intellij kotlin dan berfungsi dengan benar. Apakah ini bug di plugin gradle Kotlin baru?

alisabzevari.dll
sumber
Apakah Anda memiliki JDK 8?
Zoe
Ya, dan masalah ini hanya terjadi ketika saya membangun proyek di intellij. gradle di terminal berfungsi dengan baik!
alisabzevari
Apa versi plugin IDE yang Anda gunakan? Saya tidak dapat mereproduksi kesalahan dengan plugin 1.2.21. Jika itu juga terjadi pada versi plugin Gradle & IDE yang lebih baru, Anda dapat mengajukan masalah di kotl.in/issue dan menjelaskan langkah-langkah tepat yang menyebabkan error tersebut.
hotkey

Jawaban:

179

Saya rasa ini bisa bermanfaat bagi mereka yang menggunakan Android Studio 3.2 di Mac.

Untuk mengubah versi JVM Target Compiler Kotlin Anda harus pergi ke Android Studio -> Preferences -> Kotlin Compiler dan kemudian mengubah versi Target JVM yang dipilih dari menu dropdown.

Bagaimanapun, saya masih mendapatkan kesalahan berikut

Panggilan ke metode statis di antarmuka Java dilarang di JVM target 1.6. Kompilasi ulang dengan '-jvm-target 1.8'

TERPECAHKAN

Menambahkan yang berikut ke build.gradle saya memecahkan masalah:

android {
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

Tentang ini dan opsi konfigurasi Gradle lainnya: https://kotlinlang.org/docs/reference/using-gradle.html


Dengan Kotlin Gradle DSL:

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

(kotlinOptions as KotlinJvmOptions).apply {
    jvmTarget = JavaVersion.VERSION_1_8.toString()
}
Jairo Lozano
sumber
20
Untuk project Android, versi JVM target compiler Kotlin perlu diubah di build.gradle, bukan di preferensi Android Studio. Perubahan dalam preferensi Android Studio tidak akan memengaruhi build baris perintah.
yole
1
Terima kasih untuk ini, sangat membantu @yole
Curyous
Terima kasih untuk ini, bantuan besar,
lotosbin
2
Keren, itu membantu! Dan itu appgradle btw.
Wesely
2
Apakah mungkin untuk mengatur ini di file root build.gradle? Ini membosankan mengelola ini di seluruh modul dalam proyek multi-modul.
robotsquidward
76

Ternyata itu adalah konfigurasi compiler kotlin saya di pengaturan intellij. Dalam Settings > Build, Execution, Deployment > Compiler > Kotlin Compilerpengaturan yang disebut Target JVM versionharus diatur ke 1,8.

alisabzevari.dll
sumber
3
Dalam versi saya ada diSettings -> Other Settings -> Kotlin Compiler -> Target JVM Version
ElyashivLavi
6
Tetapi bahkan ketika disetel ke 1,8, saya masih mendapatkanCalls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
ElyashivLavi
Saya tidak memiliki Other Settingsmilik saya!
alisabzevari
39
Dalam kasus saya, saya memperbaikinya diProject Structure -> Facets -> Kotling -> Target Platform
Pablo Bastidas
Sebenarnya, saya mengatur semua hal di atas dan tidak ada pesan lagi ... belum. IJ 2018.1.5 Kotlin 1.2.50.
softjake
21

Harap periksa apakah Anda memiliki tiga hal berikut yang ditetapkan dalam gagasan:

  1. kotlin opsi di build.gradle
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. Periksa preferensi Ide yang relevan Preferensi

  2. Periksa Aspek proyek masukkan deskripsi gambar di sini

Antal Attila
sumber
16

Ada properti gradle yang digunakan oleh plugin Kotlin yang dapat digunakan. Saat Anda menambahkan

kotlin.setJvmTargetFromAndroidCompileOptions = true

ke gradle.propertiesfile Anda . Jika Anda memiliki konfigurasi ini di filebuild.config

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

masalah harus diselesaikan.

Karol Kulbaka
sumber
Proyek yang saya kerjakan telah sourceCompatibility & targetCompatibilitykonfigurasikan tetapi menambahkan masalah tersebut telah kotlin.setJvmTargetFromAndroidCompileOptions = truememecahkan masalah bagi saya
Fdo
6

// Cukup tambahkan kode di bawah ini di gradle Build Anda (Module: app)

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

Tidak begitu yakin mengapa ini berhasil, tetapi Anda dapat mencoba mengubah pengaturan di Ide itu sendiri. Karena Gradle dari command line berfungsi, tetapi tidak saat membuat dari IntelliJ ini mungkin adalah root.

Buka File -> Struktur Proyek. Buka tab Project dan pastikan Project SDK adalah 8 (atau lebih baru) dan setel Project language levelke Java 8

masukkan deskripsi gambar di sini

Konfigurasi di sana tampaknya mengganti Gradle karena beberapa alasan, jadi mengubahnya akan berhasil

Zoe
sumber
Ini adalah 8 di intellij saya!
alisabzevari
Coba batalkan cache dan mulai ulang
Zoe
Tidak berhasil. Saya memiliki proyek yang dibuat dengan intellij lama (saat ini 2017.3.4). Yang lama sedang bekerja. Saya membandingkan folder .idea dari dua proyek satu sama lain. Apakah masuk akal?
alisabzevari
2
Saya mengalami kesalahan yang sama pada proyek maven. Baru saja menyelesaikan menambahkan <kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget> ke bagian properti. Lihatlah di sini youtrack.jetbrains.com/issue/KT-17492 untuk info lebih lanjut
Paolo
Setelan "Project language level" mengontrol bagaimana kode sumber Java disorot di IDE. Ini tidak berdampak pada kompilasi Kotlin sama sekali.
yole
1

Ini juga diatur dalam pengaturan proyek, di bawah Project Settings > Modules > Kotlin. Ini adalah masalah khusus saya ... secara harfiah hal terakhir yang saya coba.

Tim Keating
sumber
1

Ini berhasil untuk saya di Gradle dengan Kotlin DSL:

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

Dalam kasus saya, saya mencoba semua opsi @alisabzevari termasuk diberikan dalam komentar, tetapi tidak berhasil,

kesalahan saya saya menambahkan file java juga di src/<sourcset_name>kotlin/folder, kemudian saya mengkonversi file java ke file kotlin. dan Voila! Berhasil.

Mungkin itu akan membantu seseorang.

dastan
sumber