web-dev-qa-db-fra.com

quelle est la différence entre la compatibilité -source et -target?

Lorsque vous utilisez le compilateur Java (javac), nous pouvons spécifier deux types de compatibilité. L'un utilise -source et l'autre utilise -target. Quelle est la différence entre ces deux?

Par exemple, -source 1.5 et -target 1.6?

De plus, existe-t-il un cas où nous utilisons un niveau de compatibilité source et cible différent?

40
Adam Lee

Depuis les javac docs :

- source Spécifie la version du code source acceptée.

- target Générez des fichiers de classe qui ciblent une version spécifiée de la machine virtuelle. Les fichiers de classe s'exécuteront sur la cible spécifiée et sur les versions ultérieures, mais pas sur les versions antérieures de la machine virtuelle.

Dans votre exemple:

-source 1.5 and -target 1.6

Cela serait utilisé pour s'assurer que le code source est compatible avec JDK 1.5, mais devrait générer des fichiers de classe pour une utilisation sur JDK 1.6 et versions ultérieures.

Tout à fait pourquoi vous feriez ceci, c'est une autre affaire.

35
skaffman

Le -source indique le niveau de conformité de votre code source: utilisez-vous des annotations? Il vous faudrait alors au moins 1.5; Utilises-tu @override sur les implémentations d'interface, vous auriez besoin de 1.6 etc

Le -target spécifie sur quelle version Java version sur laquelle vous voulez pouvoir exécuter vos classes. Vous pouvez utiliser un Java SE 7 compilateur et compilation à exécuter sur Java SE 1.5.

11
raphaëλ

Ceci est surtout utile pour produire un fichier jar fonctionnant avec une ancienne version de Java. Je crois que jusqu'à présent, tous les JDK peuvent également exécuter une version plus ancienne, il n'y a donc aucune raison réelle d'avoir une cible plus grande que la source.

Il est cependant logique de définir target sur, par exemple. 1.6 lors de l'utilisation d'un 1.7 JDK.

Je ne suis pas sûr, mais je crois que cela pourrait fonctionner dans certaines situations pour compiler un code 1.7 Java en utilisant un compilateur 1.7 dans un pot 1.6, par exemple des expressions telles que

ArrayList<Integer> foo = new ArrayList<>();

qui ne sont valides que dans la version source 1.7+ doivent compiler en code octet compatible 1.6. Mais je n'ai pas vérifié si le compilateur le fera réellement. Malheureusement, cela ne semble pas être mis en œuvre dans la pratique.