Tại sao plugin kotlin gradle không thể xây dựng với mục tiêu 1.8?


92

Tôi có dự án gradle đơn giản nhất được định cấu hình bằng intellij cho kotlin 1.2.10. Đây là tệp build.gradle của tôi:

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

Và tôi có một giao diện java đơn giản:

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

Khi tôi nhập giao diện này và thử gọi myAbsphương thức, nó không thành công với lỗi này:

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

Tôi đã tạo một ứng dụng intellij kotlin và nó hoạt động bình thường. Nó có phải là một lỗi trong plugin Kotlin gradle mới không?


Bạn có JDK 8 không?
Zoe

Có, và vấn đề này chỉ xảy ra khi tôi xây dựng dự án trong intellij. gradle trong thiết bị đầu cuối hoạt động tốt!
alisabzevari

Phiên bản plugin IDE mà bạn sử dụng là gì? Tôi không thể tạo lại lỗi với plugin 1.2.21. Nếu điều đó cũng xảy ra với các phiên bản plugin Gradle & IDE mới hơn, bạn có thể gửi sự cố tại kotl.in/issue và mô tả các bước chính xác dẫn đến lỗi.
phím nóng

Câu trả lời:


178

Tôi nghĩ điều này có thể hữu ích cho những người sử dụng Android Studio 3.2 trên Mac.

Để thay đổi phiên bản JVM của Trình biên dịch Kotlin, bạn nên chuyển đến Android Studio -> Tùy chọn -> Trình biên dịch Kotlin và sau đó thay đổi phiên bản Target JVM được chọn từ menu thả xuống.

Dù sao, tôi vẫn gặp lỗi sau

Lệnh gọi đến các phương thức tĩnh trong giao diện Java bị cấm trong mục tiêu JVM 1.6. Biên dịch lại với '-jvm-target 1.8'

GIẢI QUYẾT

Thêm phần sau vào build.gradle của tôi đã giải quyết được vấn đề:

android {
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

Giới thiệu về điều này và các tùy chọn cấu hình Gradle khác: https://kotlinlang.org/docs/reference/using-gradle.html


Với Kotlin Gradle DSL:

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

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

20
Đối với các dự án Android, phiên bản JVM đích của trình biên dịch Kotlin cần được thay đổi trong build.gradle, không phải trong tùy chọn Android Studio. Các thay đổi trong tùy chọn Android Studio sẽ không ảnh hưởng đến các bản dựng dòng lệnh.
yole 28/09/18

1
Cảm ơn vì điều này, sự trợ giúp tuyệt vời @yole
Curyous 26/10/18

Cảm ơn cho điều này, giúp đỡ rất nhiều,
lotosbin

2
Tuyệt, nó sẽ giúp! Và đó applà gradle btw.
Wesely

2
Có thể đặt điều này ở tệp build.gradle gốc không? Thật tẻ nhạt khi quản lý điều này trên các mô-đun trong một dự án nhiều mô-đun.
robotsquidward

75

Hóa ra đó là cấu hình trình biên dịch kotlin của tôi trong cài đặt intellij. Trong Settings > Build, Execution, Deployment > Compiler > Kotlin Compilermột cài đặt được gọi Target JVM versionnên được đặt thành 1.8.


3
Trong phiên bản của tôi, nó có trongSettings -> Other Settings -> Kotlin Compiler -> Target JVM Version
ElyashivLavi.

6
Nhưng ngay cả khi thiết lập để 1.8, tôi vẫn nhận đượcCalls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
ElyashivLavi

Tôi không có Other Settingscủa tôi!
alisabzevari 14/02/18

38
Trong trường hợp của tôi, tôi sửa nó trongProject Structure -> Facets -> Kotling -> Target Platform
Pablo Bastidas

Trên thực tế, tôi đã thiết lập tất cả những điều trên và không có thông báo nào nữa ... được nêu ra. IJ 2018.1.5 Kotlin 1.2.50.
softjake

21

Vui lòng kiểm tra xem bạn có ý tưởng về ba nội dung sau không:

  1. tùy chọn kotlin trong build.gradle
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. Kiểm tra các tùy chọn Ý tưởng có liên quan Sở thích

  2. Kiểm tra các khía cạnh của dự án nhập mô tả hình ảnh ở đây


15

Có một thuộc tính gradle được sử dụng bởi plugin Kotlin có thể được sử dụng. Khi bạn thêm

kotlin.setJvmTargetFromAndroidCompileOptions = true

vào gradle.propertiestệp của bạn . Khi bạn có cấu hình này trênbuild.config

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

vấn đề sẽ được giải quyết.


Dự án tôi đang làm việc đã sourceCompatibility và đã targetCompatibilityđịnh cấu hình nhưng việc thêm kotlin.setJvmTargetFromAndroidCompileOptions = truegiải pháp đã giải quyết được vấn đề cho tôi
Fdo

6

// Chỉ cần thêm đoạn mã dưới đây vào Gradle Build của bạn (Module: app)

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

1

Không hoàn toàn chắc chắn tại sao điều này hoạt động, nhưng bạn có thể thử thay đổi cài đặt trong chính Ý tưởng. Kể từ khi Gradle từ dòng lệnh hoạt động, nhưng không phải khi xây dựng từ IntelliJ, đây có thể là gốc.

Đi tới Tệp -> Cấu trúc dự án. Chuyển đến tab Dự án và đảm bảo SDK Dự án là 8 (hoặc mới hơn) và đặt thành Project language levelJava 8

nhập mô tả hình ảnh ở đây

Cấu hình trong đó dường như ghi đè Gradle vì một số lý do, vì vậy việc thay đổi nó sẽ hoạt động


Nó là 8 trong intellij của tôi!
alisabzevari

Hãy thử vô hiệu hóa bộ nhớ đệm và khởi động lại
Zoe

Không hoạt động. Tôi có một dự án được tạo bằng intellij cũ hơn (hiện tại là 2017.3.4). Cái cũ đang hoạt động. Tôi đang so sánh các thư mục .idea của hai dự án với nhau. Nó có ý nghĩa không?
alisabzevari

2
Tôi đã gặp lỗi tương tự trên một dự án maven. Vừa giải quyết việc thêm <kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget> vào phần thuộc tính. Hãy xem tại đây youtrack.jetbrains.com/issue/KT-17492 để biết thêm thông tin
Paolo

Cài đặt "Mức ngôn ngữ dự án" kiểm soát cách mã nguồn Java được tô sáng trong IDE. Nó không ảnh hưởng đến việc biên dịch Kotlin.
yole 28/09/18

1

Điều này cũng được đặt trong cài đặt dự án, dưới Project Settings > Modules > Kotlin. Đây là vấn đề cụ thể của tôi ... thực sự là điều cuối cùng tôi đã thử.


1

Điều này đã làm việc cho tôi trong Gradle với Kotlin DSL:

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

0

Trong trường hợp của tôi, tôi đã thử tất cả các tùy chọn @alisabzevari bao gồm cả được đưa ra trong nhận xét, nhưng Nó không hoạt động,

lỗi của tôi, tôi đã thêm tệp java cũng trong src/<sourcset_name>kotlin/thư mục, sau đó tôi đã chuyển đổi tệp java thành tệp kotlin. và Voila! Nó hoạt động.

Có thể nó sẽ giúp ai đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.