Почему плагин kotlin gradle не может построить с 1.8 цели?

У меня самый простой проект 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?

Ответ 1

Оказалось, что это была моя конфигурация компилятора kotlin в intellij настройках. В Settings > Build, Execution, Deployment > Compiler > Kotlin Compiler параметр с именем Target JVM version должен быть установлен в 1.8.

Ответ 2

Я думаю, что это может быть полезно для тех, кто использует Android Studio 3.2 на Mac.

Чтобы изменить версию Target JVM Kotlin Compiler, перейдите в Android Studio → "Настройки" → "Kotlin Compiler", а затем измените версию "Target JVM", выбрав ее в раскрывающемся списке.

В любом случае, я все еще получаю следующую ошибку

Вызовы статических методов в интерфейсах Java запрещены в цели 1.6 JVM. Перекомпилируйте с '-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()
}

Ответ 3

Пожалуйста, проверьте, если у вас есть три следующих идеи:

  1. параметры котлина в build.gradle
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. Проверьте соответствующие предпочтения Идеи Preferences

  2. Проверьте проект Facets enter image description here

Ответ 4

Не совсем понятно, почему это работает, но вы можете попробовать изменить настройку в самой идее. Поскольку Gradle из командной строки работает, но не при создании из IntelliJ, это, вероятно, корень.

Перейдите в Файл → Структура проекта. Перейдите на вкладку "Проект" и убедитесь, что SDK проекта равен 8 (или новее) и установите Project language level на Java 8

введите описание изображения здесь

Конфигурация там, кажется, переопределяет Gradle по какой-то причине, поэтому ее изменение должно работать

Ответ 5

Это также задается в настройках Project Settings > Modules > Kotlin. Это была моя конкретная проблема... буквально последнее, что я пробовал.

Ответ 6

В моем случае я попробовал все опции @alisabzevari, включая данные в комментарии, но это не сработало,

моя ошибка Я добавил java файл также в src/<sourcset_name>kotlin/ folder, позже я преобразовал файл java в файл kotlin. и Вуаля! Оно работает.

Может быть, это поможет кому-то.