Gestion de NoClassDefFoundError pour JAXBException en Java 9

Gestion de NoClassDefFoundError pour JAXBException en Java 9

1. introduction

Pour tous ceux qui ont essayé de mettre à niveau vers Java 9, ils ont probablement rencontré une sorte de code de compilationNoClassDefFoundError when qui fonctionnait auparavant dans les versions antérieures de Java.

Dans cet article, nous allons examiner une classe manquante commune,JAXBException, et différentes façons de la résoudre. Les solutions fournies ici sont généralement applicables à toute classe manquante lors de la mise à niveau vers Java 9.

2. Pourquoi Java 9 ne peut pas trouverJAXBException?

L'une des fonctionnalités les plus discutées de Java 9 est le système de modules. The goal of the Java 9 module system is to break apart the core JVM classes and related projects into stand-alone modules. Cela nous aide à créer des applications avec des empreintes plus petites en n'incluant que le nombre minimum de classes requises pour s'exécuter.

L'inconvénient est que de nombreuses classes ne sont plus disponibles sur le classpath par défaut. Dans ce cas, l'analyse de classeJAXBExceptione trouve dans l'un des nouveaux modules Java EE nommésjava.xml.bind. Comme ce module n’est pas requis par le moteur d’exécution Java principal, il n’est pas disponible par défaut sur le chemin des classes.

Essayer d'exécuter une application qui utiliseJAXBExceptionwill entraîne:

NoClassDefFoundError: javax/xml/bind/JAXBException

Pour contourner cewe must include the java.xml.bindmodule. Comme nous le verrons ci-dessous, il existe plusieurs façons d'y parvenir.

3. Solution a court terme

Le moyen le plus rapide de s'assurer que les classes d'API JAXB sont disponibles pour une application est d'ajouteruse the –add-modules command line argument:

--add-modules java.xml.bind

Cependant, cela pourrait ne pas être une bonne solution pour plusieurs raisons.

Tout d'abord, l'argument–add-modules est également nouveau dans Java 9. Pour les applications devant s'exécuter sur plusieurs versions de Java, cela pose certains problèmes. Nous devrons gérer plusieurs ensembles de fichiers de construction, un pour chaque version Java sur laquelle l'application s'exécute.

Pour contourner ce problème, nous pourrions également utiliser l'argument de ligne de commande-XX:+IgnoreUnrecognizedVMOptionspour les anciens compilateurs Java.

Cependant, cela signifie qu'aucune faute de frappe ou argument mal orthographié ne sera porté à notre attention. Par exemple, si nous essayons de définir une taille de tas minimale ou maximale et que nous saisissons mal le nom de l'argument, nous n'obtiendrons pas d'avertissement. Notre application continuera de démarrer, mais elle fonctionnera avec une configuration différente de celle à laquelle nous nous attendons.

Deuxièmement, l'option–add-modules  sera obsolète dans une future version de Java. Cela signifie qu'à un moment donné, après la mise à niveau vers une nouvelle version de Java, nous serons confrontés au même problème d'utilisation d'un argument de ligne de commande inconnu et nous devrons résoudre le problème à nouveau.

4. Solution à long terme

Il existe une meilleure approche qui fonctionnera avec différentes versions de Java et ne rompra pas avec les versions futures.

La solution est deutilize a dependency management tool such as Maven. Avec cette approche, nous ajouterions la bibliothèque d'API JAXB en tant que dépendance, comme toute autre bibliothèque:


    javax.xml.bind
    jaxb-api
    2.3.0

La bibliothèque ci-dessus contient uniquement les classes d'API JAXB, qui incluentJAXBException. En fonction de l'application, il peut être nécessaire d'inclure d'autres modules.

Gardez également à l'esprit que lesMaven artifact names may be different than the Java 9 module name, comme c'est le cas pour l'API JAXB. Il peut être trouvé surMaven Central.

5. Conclusion

Le système de modules Java 9 offre un certain nombre d'avantages, tels que la réduction de la taille de l'application et l'amélioration des performances.

Cependant, il introduit également des conséquences inattendues. Lors de la mise à niveau vers Java 9, il est important de comprendre les modules réellement requis par une application et de prendre des mesures pour garantir leur disponibilité sur le chemin d'accès aux classes.