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?

alisabzevari
la source
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()
}
Jairo Lozano
la source
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.

alisabzevari
la source
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

Antal Attila
la source
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.

Karol Kulbaka
la source
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"
    }
 }
Ramadas de Sivakumar
la source
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

Zoé
la source
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.

Tim Keating
la source
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()
Ayush
la source
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.

Dastan
la source