web-dev-qa-db-fra.com

Gradle sourceCompatibility n'a aucun effet sur les sous-projets

J'ai Java 6 et 7 installés sur ma machine. Gradle utilise 1.7 (vérifié à l'aide de gradle -v). Mais je dois compiler mon code pour qu'il soit compatible avec Java 1.6. Si je comprends la documentation, je peux utiliser la propriété sourceCompatibility pour le faire (et indirectement le targetCompatibility qui par défaut est le sourceCompatibility).

J'ai donc ajouté la ligne suivante à mon fichier de construction (au niveau racine, pas dans une fermeture):

sourceCompatibility = 1.6

(pour être sûr j'ai aussi ajouté le targetCompatibility = 1.6 dans certains essais, mais cela ne devrait pas faire de différence)

Pour vérifier si le résultat était réellement compatible avec 1.6, j'ai décompressé le fichier jar résultant, cd dans le fichier WEB-INF/classes dossier et utilisé javap -verbose sur le premier .class fichier que j'ai rencontré. Mais peu importe si je règle la compatibilité cible ou si j'ai utilisé 1.5 au lieu de 1.6 ou si je l’ai spécifiée sous la forme de chaîne ('1.6'), chaque fois que le résultat de javap était

minor version: 0
major version: 51

Afaik cela signifie que c'est Java 1.7 Bytecode, ce qui est faux.

Des idées pour lesquelles le paramètre sourceCompatibility- ne fonctionne pas? Ou bien javap ne constitue-t-il pas le bon moyen de vérifier la compatibilité?

PDATE: Oui, il s'agit en fait d'une construction multi-projets mais je n'ai vérifié que l'un des résultats de construction des sous-projets. Dans le fichier de construction de ce sous-projet, j'ai apporté les modifications mentionnées pour m'assurer qu'elles sont réellement appliquées. De plus, j'ai ajouté ce qui suit dans le fichier de construction du projet racine (comme le proposait également @Vidya):

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

Mais cela n'a pas aidé non plus.

PDATE 2: J'ai vérifié le réglage de sourceCompatibility avec cet extrait dans les fichiers build.gradle appropriés:

compileJava.doFirst {
    println "source compatibility " + sourceCompatibility
}

Il a révélé que mon sourceCompatibility est défini sur 1.7 bien que j'aie essayé de le définir sur 1.6. Lorsque j'ai extrait le sous-projet le plus simple et intégré par lui-même, le code sourceCompatibility est défini correctement et le code Java est compatible avec la version 1.6. Toutefois, même ce sous-projet utilise le code sourceCompatibilité incorrect lorsqu'il est utilisé dans la construction multi projet.

BTW: Les plugins que j'utilise dans certains sous-projets sont: Java, war, jetty, gwt

PDATE 3: J'ai changé les scripts construits pour n'utiliser que le plugin Java (et donc juste construire quelques jars)) et j'ai supprimé l'utilisation de war , jetty et gwt, mais tous les projets sont définis sur sourceCompatibility 1.7 malgré que je l’aie défini dans la section allprojects et dans certains sous-projets. Il reste dans les scripts de compilation la déclaration de certaines décences (maven, fichiers et autres sous-projets), la déclaration des référentiels à utiliser, la déclaration de quelques autres tâches (dont la tâche de construction ne dépend pas, elle ne devrait pas être affecté) et la configuration du fichier manifeste pour les fichiers jar créés (j’ajoute une spécification, une version d’implémentation et un titre au fichier manifeste).

Je ne vois pas en quoi cela affecterait le paramètre sourceCompatibility.

55
Joachim Kurz

Il semble que ce problème soit causé par la spécification de sourceCompatibilityavantapply plugin: 'Java', ce qui arrive si vous essayez de définir l’option de compatibilité dans allprojects.

Dans ma configuration, la situation peut être résolue en remplaçant:

allprojects {
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

avec:

allprojects {
    apply plugin: 'Java'
    sourceCompatibility = 1.6
    targetCompatibility = 1.6
}

Sera heureux si quelqu'un d'autre peut vérifier cela dans une configuration différente.

Je ne sais toujours pas si cela doit être signalé comme un bug, mais je pense que cette solution est meilleure que la solution de contournement mentionnée ci-dessus (qui a toutefois été très utile).

84
Marwin

Les symptômes indiquent que quelqu'un écrase quelque part project.sourceCompatibility. Mais étant donné qu'il existe de nombreuses façons de personnaliser Gradle, je ne peux pas dire de loin qui il s'agit.

En guise de solution de contournement, vous pouvez définir les propriétés au niveau de la tâche, ce qui compte finalement:

tasks.withType(JavaCompile) { 
    sourceCompatibility = "1.6"
    targetCompatibility = "1.6" 
}

Ajoutez ceci à allProjects { ... } bloc.

47
Peter Niederwieser

Vous devez définir les tâches compileJava dans le fichier build.gradle si vous utilisez sourceCompatibility ou targetCompatibility. Sans les tâches compileJava, les deux variables de compatibilité sont affichées sous forme de variables inutilisées dans Intellij. J'utilise la version 2.10 de Gradle.

1