Gradle, «sourceCompatibility» vs «targetCompatibility»?

130

Quelle est la relation / différence entre sourceCompatibilityet targetCompatibility? Que se passe-t-il lorsqu'ils sont définis sur des valeurs différentes?

Selon la documentation Gradle :

sourceCompatibilityest «Compatibilité de la version Java à utiliser lors de la compilation de la source Java». targetCompatibilityest la "version Java pour laquelle générer des classes."

Je crois comprendre que targetCompatibilitycela générera un bytecode java compatible avec une version spécifique de Java, est-ce un sous-ensemble de la fonctionnalité de sourceCompatibility?

Mike Rylander
la source

Réponses:

80

targetCompatibilityet des sourceCompatibilitycartes vers -target releaseet -source releasedans javac. La source est essentiellement le niveau de langue source et la cible est le niveau du bytecode qui est généré.

Plus de détails peuvent être trouvés dans la section javac de compilation croisée .

Mat
la source
1
Le lien ci-dessus pointe vers doc pour Java 7. Je me demande si vous voulez quelque chose comme docs.oracle.com/en/java/javase/11/tools/… ?
Brian Agnew le
63

Soyez prudent lorsque vous les utilisez; nous avons été mordus par des gens qui font des suppositions.

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 vous attendre à ce qu'il fonctionne sous JDK 1.5. Le problème, ce sont les bibliothèques disponibles.

Si votre code appelle une méthode qui n'est disponible que 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, elle échouera car la méthode incriminée n'est pas présente (vous obtiendrez une MethodNotFoundException ou ClassNotFoundException).

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

user1644873
la source
4
C'est une observation subtile mais très importante.
Natix
Comment les comparez-vous?
zero01alpha
Pourquoi échouez-vous la construction? L'option "bootstrap classpath" est donnée uniquement pour atténuer ce problème. Vous pouvez toujours utiliser le bootstrap approprié et cela devrait fonctionner correctement.
Codebender
6
if(JavaVersion.current() != JavaVersion.VERSION_1_8) throw new GradleException("This project requires Java 8, but it's running on "+JavaVersion.current())C'est ainsi que je règle ce problème, au tout début du fichier build.gradle.
Xerus
2
Depuis Java 9, il existe désormais une nouvelle javacoption --releasedestinée à résoudre ce problème, en autorisant uniquement l'utilisation de l'API disponible dans la version Java spécifiée. Pour plus d'informations à ce sujet, consultez stackoverflow.com/a/43103038/4653517
James Mudd
35

sourceCompatibility = spécifie que la version du langage de programmation Java sera utilisée pour compiler les fichiers .java . par exemple sourceCompatibility 1.6 = spécifie que la version 1.6 du langage de programmation Java sera utilisée pour compiler les 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 VM spécifiées 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 s'exécuteront 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

Un Jakhar
la source
comment déterminer ceux que notre projet utilise?
isJulian00
0

À mon avis, «sourceCompatibility» signifie la fonctionnalité que vous pouvez utiliser dans votre code source.Par exemple, si vous définissez sourceCompatibility sur 1.7, vous ne pouvez pas utiliser l'expression lambda qui est une nouvelle fonctionnalité de java 8 même si votre version jdk est 1.8.
Quant à «targetCompatibility», cela signifie sur quelle version de jre le fichier de classe généré peut être exécuté, si vous le définissez sur 1.8, il peut ne pas fonctionner correctement sur jdk 1.7, mais il peut généralement fonctionner sur une version supérieure de jdk.

haoyu wang
la source
0

Ce sont les indicateurs de la commande javac.

javac [options] [sourcefiles]

Options:
...
-source release - Specifies the version of source code accepted.
...
-target release - Generates class files for a specific VM version.
...

En d'autres termes: vous écrivez un code dans une sourceversion et compilez vos classes vers la targetversion VM. Afin de l'exécuter, par exemple sur un autre poste de travail avec une version java plus ancienne.

Selon: https://docs.oracle.com/en/java/javase/11/tools/javac.html

Benjamin
la source