2012-05-19 12 views
27

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?quelle est la différence entre la compatibilité -source et -target?

Par exemple, -source 1.5 et -target 1.6?

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

Répondre

21

De l'javac docs:

-source Specifies the version of source code accepted.

-target Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier versions of the VM.

Dans votre exemple:

-source 1.5 and -target 1.6 

Ce serait utilisé pour vous 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 plus tard.

Tout à fait pourquoi vous devez faire cela est une autre affaire.

+2

Notez que j'ai trouvé que 'javac' ne supporte pas toutes les combinaisons. J'ai aussi un cas d'utilisation. En Java 6 JAX-WS est intégré, donc je voulais avoir une solution fonctionnant sur Java 6 sans bibliothèques supplémentaires. Cette solution nécessitait alors que quelques clients soient exécutables sur une JVM Java 5 (et JAX-WS amenée sur le côté) et que la syntaxe '@ Override' soit modifiée de sorte qu'elle n'était pas immédiatement compilable par Java 5 javac. (Ceci était pré-maven, cela pourrait être plus facile à faire aujourd'hui) –

+0

Voir aussi '-bootclasspath' comme décrit plus loin dans [cette réponse] (http://stackoverflow.com/a/10663478/418556). –

+1

@skaffman - * "Pourquoi faire cela est une autre affaire ..." * - Java essaie d'interpréter les commentaires. Si les langues ne sont pas correctement définies, la compilation pourrait échouer à cause d'un caractère illégal dans les commentaires !!! Il est parfois plus facile de dire au compilateur d'arrêter d'interpréter les commentaires, puis de corriger l'avis de copyright dans des centaines de fichiers. – jww

10

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

Le -target spécifie la version Java que vous voulez être en mesure d'exécuter vos cours sur. Vous pouvez utiliser un compilateur Java SE 7 et le compiler pour s'exécuter sur Java SE 1.5.

7

Ceci est surtout utile pour produire un fichier jar fonctionnant avec une ancienne version de Java. Je crois que jusqu'ici tous les JDK sont capables d'exécuter des versions plus anciennes, il n'y a donc pas de raison réelle d'avoir une cible plus grande que la source.

Il est toutefois judicieux de régler target 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 à un pot de 1,6, pour exemples d'expressions telles que

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

qui ne sont valables dans la version source 1.7+ devrait compiler à 1,6 code octet compatible. Mais je n'ai pas vérifié si le compilateur le ferait réellement. Malheureusement, cela ne semble pas être mis en œuvre dans la pratique.

+2

Bien que ce soit une bonne théorie, cela ne se fera pas en pratique. Si vous essayez la source 1.7 et la cible 1.6, vous obtiendrez cette erreur: "la version source 1.7 requiert la version cible 1.7" – Tomas

+4

J'ai trouvé ce que @Tomas dit être vrai. Ce qui est irritant, puisque cela semble la combinaison la plus utile? Il vous empêche d'écrire des bibliothèques au niveau source 1.7 qui pourraient être liées dans 1.6 projets. Y a-t-il une solution à tout cela? – Matthias

+0

@Matthias Il n'y a aucun problème à lier des bibliothèques de différentes versions de classfile. La seule raison d'utiliser '-target 1.6' est si la JVM qui exécute le code est 1.6. – Nayuki

Questions connexes