Чому плагін 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?
Зоя

Так, і ця проблема трапляється лише тоді, коли я будую проект в intellij. gradle в терміналі працює нормально!
alisabzevari

Яку версію плагіна IDE ви використовуєте? Я не зміг відтворити помилку за допомогою плагіна 1.2.21. Якщо це трапиться і з новішими версіями плагінів Gradle & IDE, ви можете подати проблему за адресою kotl.in/issue і описати точні кроки, що призвели до помилки.
гаряча клавіша

Відповіді:


179

Я думаю, це може бути корисним для тих, хто використовує Android Studio 3.2 на Mac.

Щоб змінити версію Kotlin Compiler Target JVM, вам слід перейти до Android Studio -> Preferences -> Kotlin Compiler, а потім змінити версію Target JVM, вибравши зі спадного меню.

У будь-якому випадку, я все ще отримую таку помилку

Виклики статичних методів в інтерфейсах Java заборонені в JVM target 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 не вплинуть на збірки командного рядка.
йоле

1
Дякую за це, велика допомога @yole
Curyous

Дякую за це, велика допомога,
lotosbin

2
Класно, це допомагає! І це appgradle BTW.
Веселі

2
Чи можна встановити це у кореневому файлі 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
Пабло Бастідас

Власне, я встановив усе вищезазначене і більше не маю повідомлення ... поки. IJ 2018.1.5 Котлін 1.2.50.
softjake

21

Будь ласка, перевірте, чи є у вас наведені три речі в ідеї:

  1. опції kotlin у build.gradle
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. Перевірте відповідні налаштування Idea Преференції

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


16

Існує властивість gradle, яку використовує плагін Kotlin, яку можна використовувати. Коли ви додаєте

kotlin.setJvmTargetFromAndroidCompileOptions = true

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

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

проблема може бути вирішена.


Проект, над яким я працював, був sourceCompatibility і targetCompatibilityналаштований, але додав kotlin.setJvmTargetFromAndroidCompileOptions = true
вирішену

6

// Просто додайте наведений нижче код у свій Build gradle (Модуль: додаток)

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 SDK має 8 (або новішу версію) і встановіть Project language levelдля Java 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 для отримання додаткової інформації
Паоло

Параметр "Рівень мови проекту" контролює, як у IDE виділяється вихідний код Java. Це ніяк не впливає на компіляцію Котліна.
yole

1

Це також встановлено в налаштуваннях проекту під Project Settings > Modules > Kotlin. Це була моя конкретна проблема ... буквально останнє, що я спробував.


0

У моєму випадку я спробував усі варіанти @alisabzevari, включаючи подані в коментарі, але це не спрацювало,

моя помилка, я додав файл Java також у src/<sourcset_name>kotlin/папку, пізніше перетворив файл Java у файл kotlin. і Вуаля! Це працює.

Можливо, це комусь допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.