117 votes

Quel est l'indicateur --release dans le compilateur Java 9?

Java 9's javac a un nouvel indicateur --release :

 > javac --help
...

--release <release>
    Compile for a specific VM version. Supported targets: 6, 7, 8, 9
 

En quoi est-il différent des drapeaux -source et -target ? Est-ce juste un raccourci pour -source X -target X ?

140voto

Li357 Points 31390

Pas exactement.

JEP 247: Compiler pour les Anciennes Versions de Plate-forme définit cette nouvelle option de ligne de commande, --release:

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

Donc non, il n'est pas équivalent à -source N -target N. La raison pour cela est indiqué dans la "Motivation" de la section:

javac fournit deux options de ligne de commande, -source et -target, qui peut être utilisée pour sélectionner la version du langage Java, accepté par le compilateur et la version de la catégorie fichiers qu'il produit, respectivement. Cependant, par défaut, javac compile contre la version la plus récente de la plate-forme Api. Le programme compilé peut donc utiliser accidentellement Api disponible uniquement dans la version actuelle de la plate-forme. De tels programmes ne peuvent pas fonctionner sur d'anciennes versions de la plate-forme, quelles que soient les valeurs transmises à l' -source et -target. des options. C'est un à long terme de la convivialité de la douleur, puisque les utilisateurs attendent que par l'utilisation de ces options, ils obtenir des fichiers de classe qui peuvent s'exécuter sur la plate-forme spécifiée version.

En bref, en précisant la source et cible les options ne sont pas suffisantes pour la cross-compilation. Parce qu' javac, par défaut, compile contre la plus récente de la plate-forme Api, ils ne peuvent pas être garantis pour fonctionner sur des versions plus anciennes. Vous devez également indiquer le -bootclasspath correspondant à l'ancienne version de cross-compiler correctement. Cela permettrait de comprendre la bonne version de l'API pour compiler contre et permettre l'exécution de l'ancienne version. Depuis qu'il a été 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 correctement cross-compiler.

Plus de lecture dans la liste de diffusion et Oracle Docs. L'origine du bug a été déposée ici. Notez que depuis l'intégration de cette option, JDK versions ont livrés avec des descriptions de la plate-forme Api de versions plus anciennes, mentionné 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 la cross-compilation de travail.

41voto

orionll Points 1045

--release X est plus que juste un raccourci pour -source X -target X car -source et -target ne sont pas suffisants pour en toute sécurité de la compilation d'une version antérieure. Vous devez également définir un -bootclasspath drapeau qui doit correspondre à la version précédente (et ce drapeau est souvent oublié). Donc, en Java 9, ils ont fait un seul --release du drapeau qui est un remplacement pour trois indicateurs: -source, -target et -bootclasspath.

Donc, c'est un exemple de compilation Java 1.7:

javac --release 7 <source files>

Notez que vous n'avez même pas besoin d'avoir le JDK 7 installé sur votre ordinateur. JDK 9 contient déjà les informations nécessaires pour vous empêcher de vous accidentelle en les reliant à des symboles qui n'existait pas dans le JDK 7.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X