web-dev-qa-db-fra.com

Comment exprimer la dépendance dans maven des fonctionnalités de Java ee pour la transition vers Java 9?

Nous utilisons maven et avons des artefacts qui dépendent d’autres artefacts internes. Je suis en train de migrer vers Java-9 , et j'ai l’intention de tout migrer vers Java 9 d’abord sans modulariser le code (c’est-à-dire dans le module sans nom). 

Le problème que je rencontre est que nous dépendons de Java.xml.bind, qui n'est maintenant pas inclus dans les modules par défaut. Existe-t-il un moyen "correct" d'exprimer cette dépendance sur Java.xml.bind avec Maven?

19
Kevin Peterson

Le Module System décrit la manière dont les modules non nommés, comme dans le cas où vous chargez l'application à partir de classpath, construit le graphe de module. En outre, à partir de la documentation elle-même: -

Lorsque le compilateur compile le code dans le module sans nom, ou en Java le programme de lancement est appelé et la classe principale de l'application est chargée depuis le chemin de classe dans le module sans nom de la classe d'application chargeur, le jeu de modules racine par défaut pour le module non nommé est calculé comme suit:

  • Le module Java.se est une racine, s'il existe. S'il n'existe pas, alors chaque module Java.* sur le chemin du module de mise à niveau ou entre le système modules qui exports au moins un package, sans qualification, est un racine.

  • Chaque module non-Java.* sur le chemin du module de mise à niveau ou entre le système modules que exports au moins un paquetage, sans qualification, est aussi une racine.

Sinon, le jeu de modules racine par défaut dépend de la phase:

  • Au moment de la compilation, il s’agit généralement de l’ensemble des modules en cours de compilation (plus de détails sur ce qui suit);

  • Au moment du lien, il est vide; et

  • Au moment de l'exécution, il s'agit du module principal de l'application, spécifié via le fichier --module (ou -m en abrégé) option de lancement.

Il est parfois nécessaire d’ajouter des modules au jeu de racines par défaut dans afin de garantir cette plate-forme, bibliothèque ou fournisseur de services spécifique les modules seront présents dans le graphique du module. Dans n'importe quelle phase l'option

--add-modules <module>(,<module>)*<module> est un nom de module, ajoute les modules nommés au jeu de modules racine par défaut.

Un problème similaire a été rencontré dans jetty.project où un thread de la liste de diffusion jdk était traité de la même manière et dont le correctif était d'utiliser:

--add-modules Java.se.ee

qui leur a fourni l’accès à tous les modules Java SE et, dans votre cas, doivent simplement être:

--add-modules Java.xml.bind

Pour utiliser cela dans maven, vous pouvez l'intégrer au maven-compiler-plugin.__ en utilisant 

<compilerArgs>
    <arg>--add-modules</arg>
    <arg>Java.xml.bind</arg>
</compilerArgs>

comme suggéré par ZhekaKozlov ici .


Un point important à noter est que le marquage de la dépréciation d'une API signifie également que vous voudrez peut-être éviter de l'utiliser. Pour vous adapter à cette façon, vous pouvez probablement commencer à consommer la dépendance sur jaxb-api:2.3.0 , qui peut maintenant être chargée en tant que module et peut également être exécutée à partir du chemin de classe. La modification que vous devez apporter consiste à ajouter les éléments suivants à votre liste de dépendances:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

Update: - Finalement, avec Java-10 déjà sorti et JDK/11, vous devriez suivre le lien vers JEP 320: Supprimer les modules Java EE et CORBA et Remplacez davantage ces dépendances par leurs bibliothèques autonomes.

20
nullpointer

Oui, vous devez passer --add-modules au compilateur Java:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.7.0</version>
    <configuration>
        <release>9</release>
        <compilerArgs>
            <arg>--add-modules</arg>
            <arg>javax.xml.bind</arg>
        </compilerArgs>
    </configuration>
</plugin>

Ensuite, votre projet devrait compiler bien.

11
ZhekaKozlov

JAXB, ainsi que les autres API partagées avec Java EE (JAX-WS, JAF, JTA et les "Annotations communes") sont obsolètes dans Java SE 9 et il est proposé de les supprimer dans une version ultérieure de Java SE. le JDK. Chacune de ces API a une version/téléchargement autonome. Chaque API a son propre JSR qui le maintient aussi. La transition des API incluses dans le JDK vers les versions autonomes sera bien sûr un peu perturbante.

Une première étape pour supprimer ces API de Java SE et du JDK consiste à ne pas résoudre les modules contenant ces API par défaut. Lorsque vous compilez ou exécutez du code sur le chemin de classe avec JDK 9, il apparaîtra initialement que les API n'existent pas. Comme indiqué dans une autre réponse, une solution rapide consiste à compiler ou à exécuter avec --add-modules Java.xml.bind. Cette option CLI ajoute le module "Java.xml.bind" à l'ensemble des modules racine à résoudre au démarrage et fonctionne avec JDK 9, car ce module est inclus dans l'image d'exécution JDK.

Outre la solution de contournement rapide, les applications ou les bibliothèques utilisant JAXB devront passer à la version autonome de l’API/de la mise en oeuvre. JAXB 2.3.0 doit bientôt être publié sur Maven Central et inclut les modifications permettant de travailler avec JDK 9 et les versions ultérieures. La version autonome peut être déployée sur le chemin d'accès aux classes, à l'instar d'autres fichiers JAR. Il sera éventuellement possible de déployer la version autonome sur le chemin du module (de mise à niveau) et de l'utiliser également comme module. Le Guide de migration du JDK 9 contiendra davantage d'informations sur les options de migration du code utilisant JAXB ou les autres API partagées avec Java EE.

7
Alan Bateman

Ok j'espère que cela aide quelqu'un. Si par hasard vous avez installé Java 9 ou 10 et constatez que vous ne pouvez pas dépasser cette erreur javax.xml.bind error, vous utilisez peut-être Java 8 sous la forme de jenv par dossier ( vraiment, je suis désolé d’être aussi vague, mais c’est tout ce dont j’ai le temps pour le moment)? 

Mais l’ajout d’un paramètre correct pour Java_HOME a résolu le problème suivant: export Java_HOME="$(/usr/libexec/Java_home -v 1.8)" sous MacOS.

0
Brett Tofel