Quel est l’indicateur –release dans le compilateur Java 9?

Le javac Java 9 a un nouvel indicateur --release :

 > javac --help ... --release  Comstack for a specific VM version. Supported targets: 6, 7, 8, 9 

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

Pas exactement.

JEP 247: Comstackr pour les versions plus anciennes de la 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 seront liés à une implémentation de la version de plate-forme donnée. Pour les plates-formes prédéfinies dans javac , --release N est équivalent à -source N -target N -bootclasspath . (emphase le mien)

Donc non, ce n’est pas équivalent à -source N -target N La raison de cet ajout est indiquée dans la section “Motivation”:

javac fournit deux options de ligne de commande, -source et -target , qui peuvent être utilisées pour sélectionner respectivement la version du langage Java acceptée par le compilateur et la version des fichiers de classe qu’il produit. Par défaut, javac comstack par rapport à la version la plus récente des API de la plate-forme. Le programme compilé peut donc utiliser accidentellement des API uniquement disponibles dans la version actuelle de la plate-forme. De tels programmes ne peuvent pas s’exécuter sur les anciennes versions de la plate-forme, quelles que soient les valeurs transmises à -source et `-target. options Il s’agit d’un problème de convivialité à 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é, spécifier les options source et cible ne suffit pas pour la compilation croisée. Parce que javac , par défaut, comstack avec les plus récentes des API de la plate-forme, 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 effectuer une compilation croisée correcte. Cela inclurait la bonne version de l’API pour comstackr et permettre l’exécution sur les anciennes versions. Comme il était très souvent oublié, il a été décidé d’append une option de ligne de commande qui ferait toutes les choses nécessaires pour effectuer une compilation croisée correcte.

Lectures supplémentaires dans la liste de diffusion et Oracle Docs . Le bug original a été déposé ici . Notez que depuis l’intégration de cette option, les versions de JDK contiennent des descriptions des API de la 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.

--release X est plus qu’un simple raccourci vers -source X -target X car -source et -target ne suffisent pas à comstackr en toute sécurité vers une version antérieure. Vous devez également définir un indicateur -bootclasspath qui doit correspondre à l’ancienne version (et cet indicateur est souvent oublié). Ainsi, en Java 9, ils ont créé un seul drapeau --release qui remplace trois indicateurs: -source , -target et -bootclasspath .

Voici donc un exemple de compilation vers Java 1.7:

 javac --release 7  

Notez que vous n’avez même pas besoin d’installer JDK 7 sur votre ordinateur. 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.