ทำไมปลั๊กอิน kotlin gradle ไม่สามารถสร้างด้วย 1.8 เป้าหมาย


93

ฉันมีโครงการ gradle ที่ง่ายที่สุดที่กำหนดค่าโดยใช้ intellij สำหรับ kotlin 1.2.10 นี่คือไฟล์ 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 และทำงานได้อย่างถูกต้อง เป็นบั๊กในปลั๊กอินใหม่ของ Kotlin gradle หรือไม่?


คุณมี JDK 8 หรือไม่?
Zoe

ใช่และปัญหานี้จะเกิดขึ้นเมื่อฉันสร้างโครงการใน intellij เท่านั้น gradle ใน Terminal ใช้งานได้ดี!
alisabzevari

เวอร์ชันปลั๊กอิน IDE ที่คุณใช้คืออะไร ฉันไม่สามารถสร้างข้อผิดพลาดซ้ำกับปลั๊กอิน 1.2.21 หากสิ่งนี้เกิดขึ้นกับปลั๊กอิน Gradle & IDE ที่ใหม่กว่าเช่นกันคุณสามารถแจ้งปัญหาได้ที่kotl.in/issueและอธิบายขั้นตอนที่แน่นอนที่นำไปสู่ข้อผิดพลาด
ฮอต

คำตอบ:


179

ฉันคิดว่านี่อาจเป็นประโยชน์สำหรับผู้ที่ใช้ Android Studio 3.2 บน Mac

ในการเปลี่ยนเวอร์ชัน JVM ของ Kotlin Compiler Target คุณควรไปที่ Android Studio -> Preferences -> Kotlin Compiler จากนั้นเปลี่ยนเวอร์ชัน Target JVM ที่เลือกจากเมนูแบบเลื่อนลง

อย่างไรก็ตามฉันยังคงได้รับข้อผิดพลาดต่อไปนี้

ห้ามการเรียกใช้เมธอดแบบคงที่ในอินเตอร์เฟส Java ใน JVM เป้าหมาย 1.6 คอมไพล์ใหม่ด้วย '-jvm-target 1.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 ต้องเปลี่ยนเวอร์ชัน JVM ของคอมไพเลอร์เป้าหมายของคอมไพเลอร์ Kotlin ใน build.gradle ไม่ใช่ในการตั้งค่า Android Studio การเปลี่ยนแปลงค่ากำหนดของ Android Studio จะไม่ส่งผลต่อการสร้างบรรทัดคำสั่ง
yole

1
ขอบคุณสำหรับสิ่งนี้ความช่วยเหลือที่ดี @yole
Curyous

ขอบคุณสำหรับสิ่งนี้ความช่วยเหลือที่ดี
lotosbin

2
เจ๋งมันช่วยได้! และมันเป็นappเรื่องที่น่าสนใจ
Wesely

2
เป็นไปได้ไหมที่จะตั้งค่านี้ที่ไฟล์ root build.gradle การจัดการสิ่งนี้ระหว่างโมดูลในโครงการหลายโมดูลเป็นเรื่องที่น่าเบื่อ
robotsquidward

76

ปรากฎว่ามันเป็นการกำหนดค่าคอมไพเลอร์ kotlin ของฉันในการตั้งค่า intellij ในSettings > Build, Execution, Deployment > Compiler > Kotlin Compilerการตั้งค่าที่เรียกว่าTarget JVM versionควรตั้งค่าเป็น 1.8


3
ในเวอร์ชันของฉันมันอยู่ในSettings -> Other Settings -> Kotlin Compiler -> Target JVM Version
ElyashivLavi

6
แต่ถึงแม้จะตั้งค่าเป็น 1.8 ฉันก็ยังได้รับCalls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
ElyashivLavi

ฉันไม่มีOther Settingsในของฉัน!
alisabzevari

39
ในกรณีของฉันฉันแก้ไขในProject Structure -> Facets -> Kotling -> Target Platform
Pablo Bastidas

อันที่จริงฉันตั้งค่าทั้งหมดข้างต้นและไม่มีข้อความอีกเลย ... IJ 2018.1.5 Kotlin 1.2.50.
softjake

21

โปรดตรวจสอบว่าคุณมีแนวคิดสามประการต่อไปนี้หรือไม่:

  1. ตัวเลือก kotlin ใน build.gradle
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. ตรวจสอบการตั้งค่าไอเดียที่เกี่ยวข้อง ค่ากำหนด

  2. ตรวจสอบ Facets ของโครงการ ป้อนคำอธิบายภาพที่นี่


16

มีคุณสมบัติ gradle ที่ใช้โดยปลั๊กอิน Kotlin ซึ่งสามารถใช้ได้ เมื่อคุณเพิ่ม

kotlin.setJvmTargetFromAndroidCompileOptions = true

ไปยังgradle.propertiesไฟล์ของคุณ เมื่อคุณมีการกำหนดค่านี้ในไฟล์build.config

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

ปัญหาควรได้รับการแก้ไข


โครงการที่ฉันกำลังดำเนินการมีsourceCompatibility & targetCompatibilityกำหนดค่าไว้ แต่เพิ่มการkotlin.setJvmTargetFromAndroidCompileOptions = trueแก้ไขปัญหาให้ฉัน
Fdo

6

// เพียงเพิ่มโค้ดด้านล่างใน Build gradle ของคุณ (Module: app)

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

2

สิ่งนี้ใช้ได้ผลสำหรับฉันใน Gradle กับ Kotlin DSL:

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

1

ไม่ค่อยแน่ใจว่าทำไมถึงได้ผล แต่คุณสามารถลองเปลี่ยนการตั้งค่าในไอเดียเอง เนื่องจาก Gradle จากบรรทัดคำสั่งใช้งานได้ แต่ไม่ใช่เมื่อสร้างจาก IntelliJ นี่อาจเป็นรูท

ไปที่ไฟล์ -> โครงสร้างโครงการ ไปที่แท็บ Project และตรวจสอบว่า Project SDK เป็น 8 (หรือใหม่กว่า) และตั้งค่าเป็นProject language levelJava 8

ป้อนคำอธิบายภาพที่นี่

การกำหนดค่าในนั้นดูเหมือนว่าจะแทนที่ Gradle ด้วยเหตุผลบางประการดังนั้นการเปลี่ยนควรใช้งานได้


มันคือ 8 ใน Intellij ของฉัน!
alisabzevari

ลองทำให้แคชเป็นโมฆะและรีสตาร์ท
Zoe

ไม่ได้ผล ฉันมีโปรเจ็กต์ที่สร้างขึ้นด้วย intellij รุ่นเก่า (ปัจจุบันคือ 2017.3.4) อันเก่าใช้งานได้ ฉันกำลังเปรียบเทียบโฟลเดอร์ .idea ของสองโปรเจ็กต์ซึ่งกันและกัน มันเข้าท่าไหม?
alisabzevari

2
ฉันมีข้อผิดพลาดเดียวกันในโครงการ maven เพิ่งแก้ไขการเพิ่ม <kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget> ในส่วนคุณสมบัติ ดูที่นี่youtrack.jetbrains.com/issue/KT-17492สำหรับข้อมูลเพิ่มเติม
เปาโล

การตั้งค่า "ระดับภาษาของโครงการ" ควบคุมวิธีการไฮไลต์ซอร์สโค้ด Java ใน IDE ไม่มีผลกระทบต่อการรวบรวม Kotlin แต่อย่างใด
yole

1

Project Settings > Modules > Kotlinแห่งนี้ตั้งอยู่ในการตั้งค่าโครงการภายใต้ นี่เป็นปัญหาเฉพาะของฉัน ... เป็นสิ่งสุดท้ายที่ฉันพยายามอย่างแท้จริง


0

ในกรณีของฉันฉันลองใช้ตัวเลือก @alisabzevari ทั้งหมดรวมทั้งให้ไว้ในความคิดเห็น แต่ไม่ได้ผล

ความผิดพลาดของฉันฉันเพิ่มไฟล์ java ในsrc/<sourcset_name>kotlin/โฟลเดอร์ด้วยหลังจากนั้นฉันก็แปลงไฟล์ java เป็นไฟล์ kotlin และ Voila! มันได้ผล.

อาจจะช่วยใครได้บ้าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.