Почему плагин 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 в терминале работает нормально!
alisabzevari
Какую версию плагина IDE вы используете? Не удалось воспроизвести ошибку плагином 1.2.21. Если это произойдет и с новыми версиями плагинов Gradle и IDE, вы можете сообщить о проблеме на kotl.in/issue и описать точные шаги, которые приводят к ошибке.
горячая клавиша

Ответы:

179

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

Чтобы изменить версию целевой JVM компилятора Kotlin, перейдите в Android Studio -> Настройки -> Компилятор Kotlin, а затем измените целевую версию 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 05
2
Круто, помогает! И это, appкстати, градл.
Wesely
2
Можно ли установить это в корневом файле build.gradle? Управлять этим между модулями в многомодульном проекте утомительно.
robotsquidward
75

Оказалось, что это была моя конфигурация компилятора 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
38
В моем случае я исправляю этоProject Structure -> Facets -> Kotling -> Target Platform
Пабло Бастидас
Собственно, я установил все вышеперечисленное и больше никаких сообщений ... пока. IJ 2018.1.5 Kotlin 1.2.50.
softjake
21

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

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

  2. Проверьте проект Facets введите описание изображения здесь

Антал Аттила
источник
16

В плагине Kotlin есть свойство gradle, которое можно использовать. Когда вы добавляете

kotlin.setJvmTargetFromAndroidCompileOptions = true

в ваш gradle.propertiesфайл. Когда у вас есть эта конфигурация на вашемbuild.config

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

проблема должна быть решена.

Кароль Кульбака
источник
Проект, над которым я работал, был sourceCompatibility и targetCompatibilityнастроен, но добавление kotlin.setJvmTargetFromAndroidCompileOptions = trueрешенной для меня проблемы
Fdo
6

// Просто добавьте приведенный ниже код в свой градиент сборки (Module: app)

compileOptions {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
    kotlinOptions {
        jvmTarget = "1.8"
    }
 }
Шивакумар Рамадас
источник
1

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

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

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

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

Зои
источник
В моем интеллигенте 8!
alisabzevari 04
Попробуйте сделать кеши недействительными и перезапустите
Зои
Не сработало. У меня есть проект, созданный с использованием более старого intellij (текущий - 2017.3.4). Старый рабочий. Я сравниваю папки .idea двух проектов друг с другом. Имеет ли это смысл?
alisabzevari 04
2
У меня была такая же ошибка в проекте maven. Просто решил добавить <kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget> в раздел свойств. Посмотрите здесь youtrack.jetbrains.com/issue/KT-17492 для получения дополнительной информации
Паоло
Параметр «Уровень языка проекта» определяет, как исходный код Java выделяется в среде IDE. Это никак не влияет на компиляцию Kotlin.
йоле
1

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

Тим Китинг
источник
1

Это сработало для меня в Gradle с Kotlin DSL:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
val compileKotlin: KotlinCompile by tasks
compileKotlin.kotlinOptions.jvmTarget = JavaVersion.VERSION_11.toString()
Аюш
источник
0

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

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

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

дастан
источник