2017-03-29 2 views

Répondre

29

Pas exactement. Voici un lien vers la proposal pour l'option:

Nous avons défini une nouvelle option de ligne de commande, --release, qui configure automatiquement le compilateur pour produire des fichiers de classe qui seront liés à une mise en œuvre de la version de la plate-forme donnée. Pour les plates-formes prédéfinies en javac, --release N est équivalent à -source N -target N -bootclasspath <bootclasspath-from-N>. (emphase mienne)

Donc non, ce n'est pas équivalent à -source N -target N. La raison de cet ajout est indiqué dans la section « Motivation »:

javac propose deux options de ligne de commande, -source et -target, qui peut être utilisé pour sélectionner la version du langage Java accepté par le compilateur et la version des fichiers de classe qu'il produit, respectivement. Par défaut, cependant, javac se compile par rapport à la version la plus récente des API de la plateforme. Le programme compilé peut donc utiliser accidentellement des API disponibles uniquement dans la version actuelle de la plateforme. Ces programmes ne peuvent pas s'exécuter sur des versions plus anciennes de la plate-forme, quelles que soient les valeurs transmises aux -source et `-target. options Il s'agit d'un point de difficulté d'utilisation à long terme, car les utilisateurs s'attendent à ce qu'en utilisant ces options, ils obtiennent des fichiers de classe pouvant s'exécuter sur la version de plate-forme spécifiée.

En résumé, la spécification des options source et cible n'est pas suffisante pour la compilation croisée. Parce que javac, par défaut, compile avec les API de plate-forme les plus récentes, il est impossible de garantir leur exécution sur des versions plus anciennes. Vous devez également spécifier l'option -bootclasspath correspondant à l'ancienne version pour une compilation croisée correcte. Cela inclurait la version de l'API correcte à compiler et permettre l'exécution sur une version plus ancienne. Comme il était très souvent oublié, il a été décidé d'ajouter une option de ligne de commande qui a fait toutes les choses nécessaires pour compiler correctement.

Lecture supplémentaire in the mailing list et Oracle Docs. Le bug original a été classé here. Notez que depuis l'intégration de cette option, les versions JDK sont livrées avec des descriptions des API de plate-forme des anciennes versions, mentionnées dans la section "Risques et hypothèses". Cela signifie que vous n'avez pas besoin de l'ancienne version installée sur votre machine pour que la compilation croisée fonctionne.

6

--release X est plus qu'un raccourci vers -source X -target X parce -source et -target ne sont pas suffisantes pour établir en toute sécurité à une version antérieure. Vous devez également définir un drapeau -bootclasspath qui doit correspondre à l'ancienne version (et ce drapeau est souvent oublié). Donc, en Java 9, ils ont fait un seul drapeau --release qui est un remplacement pour trois drapeaux: -source, -target et -bootclasspath. Donc, voici un exemple de compilation en Java 1.7:

javac --release 7 <source files> 

Notez que vous n'avez même pas besoin d'installer JDK 7 sur votre ordinateur. Le JDK 9 contient déjà les informations nécessaires pour vous empêcher de créer des liens accidentels avec des symboles qui n'existaient pas dans JDK 7.