J'ai créé un service Web à l'aide de Spring. Cela fonctionne bien lorsque je l'exécute sur mon serveur Tomcat intégré. Cependant, lorsque je le compresse en tant que fichier JAR et l'exécute avec la commande Java -jar
, je reçois cette exception.
Mon service envoie une simple demande soap et la réponse du serveur est la suivante:
"exception": "Java.lang.NoClassDefFoundError",
"message": "javax/xml/soap/SOAPException",
C'est la réponse que je reçois dans Postman.
Toutes les idées où je peux chercher le problème.
JavaSE 8 inclut le package Java.xml.soap
.
JavaSE 9 a déplacé le package javax.xml.soap
vers le module Java.xml.ws
.
Les modules partagés avec JEE (comme Java.xml.ws
) sont inclus dans JavaSE 9, mais sont
- obsolète à supprimer d'une future version de JavaSE, et
- pas sur le chemin de module par défaut .
Une solution rapide consiste à
- lancez le pot avec JRE 8: $MY_JRE8_HOME/bin/Java -jar my.jar
, ou
- ajouter un module pour JRE 9: Java --add-modules Java.xml.ws -jar my.jar
À plus long terme, les projets JavaSE qui utilisent des modules tels que Java.xml.ws
doivent explicitement inclure le module comme les autres bibliothèques.
Voir https://stackoverflow.com/a/46359097
Voir Guide de migration du JDK 9: Modules partagés avec JEE non résolus par défaut
(Reproduction de NoClassDefError et solutions de contournement avec le projet de service Web zipped SOAP à https://spring.io/guides/gs/producing-web-service/ )
J'ai importé celui-ci pour résoudre le problème: https://mvnrepository.com/artifact/javax.xml.soap/javax.xml.soap-api/1.4.0
L'ajout de ce qui suit dans le fichier pom a résolu le problème
<!-- https://mvnrepository.com/artifact/javax.xml.soap/javax.xml.soap-api -->
<dependency>
<groupId>javax.xml.soap</groupId>
<artifactId>javax.xml.soap-api</artifactId>
<version>1.4.0</version>
</dependency>