Pourquoi le plugin Kotlin Gradle ne peut pas construire avec la cible 1.8?


93

J'ai le projet gradle le plus simple configuré à l'aide d'intellij pour kotlin 1.2.10. Voici mon fichier 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"
}

Et j'ai une interface java simple:

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

Lorsque j'importe cette interface et que j'essaie d'appeler la myAbsméthode, cela échoue avec cette erreur:

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

J'ai créé une application intellij kotlin et elle fonctionnait correctement. Est-ce un bogue dans le nouveau plugin Kotlin Gradle?


Avez-vous JDK 8?
Zoe le

Oui, et ce problème ne se produit que lorsque je construis le projet dans intellij. gradle dans le terminal fonctionne très bien!
alisabzevari le

Quelle est la version du plugin IDE que vous utilisez? Je n'ai pas pu reproduire l'erreur avec le plugin 1.2.21. Si cela se produit également avec les versions plus récentes du plugin Gradle & IDE, vous pouvez signaler un problème sur kotl.in/issue et décrire les étapes exactes qui ont conduit à l'erreur.
raccourci clavier du

Réponses:


179

Je pense que cela pourrait être utile pour ceux qui utilisent Android Studio 3.2 sur Mac.

Pour changer la version JVM cible du compilateur Kotlin, vous devez aller dans Android Studio -> Préférences -> Compilateur Kotlin, puis changer la version JVM cible en choisissant dans la liste déroulante.

Quoi qu'il en soit, j'obtiens toujours l'erreur suivante

Les appels aux méthodes statiques dans les interfaces Java sont interdits dans la cible JVM 1.6. Recompiler avec '-jvm-target 1.8'

RÉSOLU

L'ajout de ce qui suit à mon build.gradle a résolu le problème:

android {
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

À propos de cela et d'autres options de configuration de Gradle: https://kotlinlang.org/docs/reference/using-gradle.html


Avec Kotlin Gradle DSL:

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

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

20
Pour les projets Android, la version JVM cible du compilateur Kotlin doit être modifiée dans build.gradle, pas dans les préférences d'Android Studio. Les modifications apportées aux préférences d'Android Studio n'affecteront pas les versions de ligne de commande.
yole

1
Merci pour cela, aide précieuse @yole
Curyous

Merci pour cela, grande aide,
lotosbin

2
Cool, ça aide! Et c'est appgradle btw.
Wesely le

2
Est-il possible de définir cela dans le fichier racine build.gradle? Il est fastidieux de gérer cela à travers les modules dans un projet multi-modules.
robotsquidward le

75

Il s'est avéré que c'était ma configuration de compilateur kotlin dans les paramètres intellij. Dans Settings > Build, Execution, Deployment > Compiler > Kotlin Compilerun paramètre appelé Target JVM versionaurait dû être défini sur 1.8.


3
Dans ma version c'est dansSettings -> Other Settings -> Kotlin Compiler -> Target JVM Version
ElyashivLavi

6
Mais même réglé sur 1,8, je reçois toujoursCalls to static methods in Java interfaces are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8'
ElyashivLavi

Je n'ai pas Other Settingsdans le mien!
alisabzevari

38
Dans mon cas, je le répare dansProject Structure -> Facets -> Kotling -> Target Platform
Pablo Bastidas

En fait, j'ai mis tout ce qui précède et plus de message ... pour le moment. IJ 2018.1.5 Kotlin 1.2.50.
softjake

21

Veuillez vérifier si vous avez les trois éléments suivants en idée:

  1. options kotlin dans build.gradle
    kotlinOptions {
        jvmTarget = '1.8'
    }
  1. Vérifiez les préférences Idea pertinentes Préférences

  2. Vérifiez les facettes du projet entrez la description de l'image ici


16

Il existe une propriété gradle utilisée par le plugin Kotlin qui peut être utilisée. Lorsque vous ajoutez

kotlin.setJvmTargetFromAndroidCompileOptions = true

à votre gradle.propertiesdossier. Lorsque vous avez cette configuration sur votrebuild.config

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

le problème doit être résolu.


Le projet sur sourceCompatibility targetCompatibilitykotlin.setJvmTargetFromAndroidCompileOptions = true
lequel

6

// Ajoutez simplement le code ci-dessous dans votre niveau de construction (Module: app)

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

1

Vous ne savez pas exactement pourquoi cela fonctionne, mais vous pouvez essayer de modifier le paramètre dans l'idée elle-même. Puisque Gradle à partir de la ligne de commande fonctionne, mais pas lors de la construction à partir d'IntelliJ, il s'agit probablement de la racine.

Allez dans Fichier -> Structure du projet. Accédez à l'onglet Projet et assurez-vous que Project SDK est 8 (ou plus récent) et définissez le Project language levelsur Java 8

entrez la description de l'image ici

La configuration là-dedans semble remplacer Gradle pour une raison quelconque, donc la changer devrait fonctionner


Il est 8 dans mon intellij!
alisabzevari le

Essayez d'invalider les caches et de redémarrer
Zoe

Ça n'a pas marché. J'ai un projet créé avec une ancienne intellij (actuellement 2017.3.4). L'ancien fonctionne. Je compare les dossiers .idea de deux projets entre eux. Est-ce que ça fait du sens?
alisabzevari le

2
J'ai eu la même erreur sur un projet maven. Juste résolu en ajoutant <kotlin.compiler.jvmTarget> 1.8 </kotlin.compiler.jvmTarget> à la section des propriétés. Jetez un oeil ici youtrack.jetbrains.com/issue/KT-17492 pour plus d'informations
Paolo

Le paramètre «Niveau de langue du projet» contrôle la façon dont le code source Java est mis en surbrillance dans l'EDI. Cela n'a aucun impact sur la compilation de Kotlin.
yole

1

Ceci est également défini dans les paramètres du projet, sous Project Settings > Modules > Kotlin. C'était mon problème spécifique ... littéralement la dernière chose que j'ai essayée.


1

Cela a fonctionné pour moi à Gradle avec Kotlin DSL:

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

0

Dans mon cas, j'ai essayé toutes les options @alisabzevari, y compris celles données en commentaire, mais cela n'a pas fonctionné,

mon erreur j'ai ajouté le fichier java également dans src/<sourcset_name>kotlin/ dossier, plus tard j'ai converti le fichier java en fichier kotlin. et voila! Ça marche.

Peut-être que cela aidera quelqu'un.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.