Quelle est la relation / différence entre sourceCompatibility
et targetCompatibility
? Que se passe-t-il lorsqu'ils sont définis sur des valeurs différentes?
Selon la documentation Gradle :
sourceCompatibility
est «Compatibilité de la version Java à utiliser lors de la compilation de la source Java».
targetCompatibility
est la "version Java pour laquelle générer des classes."
Je crois comprendre que targetCompatibility
cela générera un bytecode java compatible avec une version spécifique de Java, est-ce un sous-ensemble de la fonctionnalité de sourceCompatibility
?
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.
la source
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.javac
option--release
destiné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/4653517sourceCompatibility = 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
la source
À 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.
la source
Ce sont les indicateurs de la commande javac.
En d'autres termes: vous écrivez un code dans une
source
version et compilez vos classes vers latarget
version 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
la source