web-dev-qa-db-fra.com

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

J'ai le projet de Gradle le plus simple configuré en utilisant 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 méthode myAbs, celle-ci échoue avec l'erreur suivante:

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 bug dans le nouveau plugin Kotlin Gradle?

17
alisabzevari

Il s’est avéré que c’était ma configuration du compilateur Kotlin dans les paramètres intellij. Dans Settings > Build, Execution, Deployment > Compiler > Kotlin Compiler, un paramètre appelé Target JVM version aurait dû être défini sur 1.8.

28
alisabzevari

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

Pour changer la version de la machine virtuelle Java cible du compilateur Kotlin, vous devez accéder à Android Studio -> Préférences -> Compilateur Kotlin, puis modifier la version de la machine virtuelle cible en choisissant dans le menu déroulant.

Quoi qu'il en soit, je reçois 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

Ajouter 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

26
Jairo Lozano

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
Tim Keating

Vous ne savez pas trop 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, c'est probablement 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 level sur Java 8.

 enter image description here

La configuration ici semble prendre le pas sur Gradle pour une raison quelconque, donc le changer devrait fonctionner

1
Zoe

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

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

Peut-être que cela aidera quelqu'un. 

0
dastan