web-dev-qa-db-fra.com

Gradle, "sourceCompatibility" vs "targetCompatibility"?

Quelle est la relation/différence entre sourceCompatibility et targetCompatibility? Que se passe-t-il quand ils sont réglés sur différentes valeurs?

Selon documentation Gradle :

sourceCompatibility est "Compatibilité de version Java à utiliser lors de la compilation Java source."] targetCompatibility est "Version Java pour laquelle générer des classes."

Si j'ai bien compris, targetCompatibility générera Java compatible avec une version spécifique de Java. S'agit-il d'un sous-ensemble des fonctionnalités de sourceCompatibility?

108
Mike Rylander

cela mappe vers javac - voir la section de compilation croisée - source est fondamentalement le niveau de langue source et cible est le niveau du bytecode généré.

66
Matt

Soyez prudent lorsque vous utilisez ces derniers; nous avons été mordus par des personnes faisant des hypothèses.

Ce n'est pas parce que vous utilisez sourceCompability (ou targetCompatibility) de 1.5 que vous pouvez toujours compiler votre code avec JDK 1.6 et que vous vous attendez à ce qu'il fonctionne sous JDK 1.5. Le problème concerne les bibliothèques disponibles.

Si votre code appelle une méthode disponible uniquement dans JDK 1.6, il sera toujours compilé avec les différentes options de compatibilité pour la machine virtuelle cible. Mais lorsque vous l'exécutez, il échouera car la méthode incriminée n'est pas présente (vous obtiendrez une exception MethodNotFoundException ou ClassNotFoundException).

Pour cette raison, je toujours compare le paramètre de compatibilité à la version actuelle Java que je construis sous. S'ils ne correspondent pas, la construction échoue.

49
user1644873

sourceCompatibility = spécifie que la version du langage de programmation Java doit être utilisée pour compiler les fichiers . Java. p.ex. sourceCompatibility 1.6 = spécifie que la version 1.6 de le langage de programmation Java soit utilisé pour compiler des fichiers . Java.

Par défaut sourceCompatibility = "version de la JVM actuellement utilisée" et targetCompatibility = sourceCompatibility

targetCompatibility = L'option garantit que les fichiers de classe générés seront compatibles avec les ordinateurs virtuels spécifiés par targetCompatibility. Notez que dans la plupart des cas, la valeur de l'option -target est la valeur de l'option -source; dans ce cas, vous pouvez omettre l'option -target.

Les fichiers de classe seront exécutés sur la cible spécifiée par targetCompatibility et sur les versions ultérieures, mais pas sur les versions antérieures de la machine virtuelle

30
A Jakhar