49

I have created a Web Service using Spring. It works fine when running it on my embedded tomcat server. However when I package it as a JAR file and run it with java -jar command, I am receiving this exception.

My service sends a simple soap request and the server response is:

 "exception": "java.lang.NoClassDefFoundError",
    "message": "javax/xml/soap/SOAPException",

That's the response I get in Postman.

Any ideas where I can look for the problem.

HRgiger
  • 2,750
  • 26
  • 37
grangos
  • 501
  • 1
  • 4
  • 4
  • do you create a fat jar, ie. are dependencies getting packaged along with the jar? – best wishes Feb 05 '18 at 16:17
  • There is a class file that doesn't exist in your project. You probably didn't package your jar dependencies correctly. This error will come up if there is a missing class file. – Sam Orozco Feb 05 '18 at 16:17

8 Answers8

39

Adding the following in pom file solved the issue

<!-- 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>
Jithin U. Ahmed
  • 1,495
  • 1
  • 19
  • 29
  • worked for me. My SOAP-API-Client Code (Springboot WAR) was running fine through "mvn spring-boot:run" but throwing this error on Tomcat 8.5. However not sure what causes "mvn spring-boot:run" to succeed in first place. Can it be that local JDK/JRE or Maven's underlying jar plays some role there ? – nirmalsingh Aug 10 '21 at 04:37
  • worked for me. jdk 9; javax.xml.soap:javax.xml.soap-api 1.4.0; and also com.sun.xml.messaging.saaj:saaj-impl 1.5.1; as mentioned by Harisudha – Guilherme Stella Jan 05 '22 at 13:52
35

JavaSE 8 includes package java.xml.soap.
JavaSE 9 moved package javax.xml.soap to the module java.xml.ws.
Modules shared with JEE (like java.xml.ws) are included in JavaSE 9, but are
- deprecated for removal from a future version of JavaSE, and
- not on the default module path.

A quick workaround is to either
- run the jar with JRE 8: $MY_JRE8_HOME/bin/java -jar my.jar, or
- add a module for JRE 9: java --add-modules java.xml.ws -jar my.jar

Longer term, JavaSE projects that use modules like java.xml.ws must explicitly include the module like other libraries.

See https://stackoverflow.com/a/46359097
See JDK 9 Migration Guide: Modules Shared with JEE Not Resolved by Default

(Reproduced NoClassDefError and workarounds with zipped SOAP web service project at https://spring.io/guides/gs/producing-web-service/)

user9712582
  • 1,215
  • 7
  • 16
33

Yes, In Java 11 java.xml.soap was completely removed. java.lang.NoClassDefFoundError: javax/xml/soap/SOAPException can be removed by adding the following dependency.

<dependency>
    <groupId>jakarta.xml.soap</groupId>
    <artifactId>jakarta.xml.soap-api</artifactId>
    <version>2.0.0-RC3</version>
</dependency>

But later, you will encounter , javax.xml.soap.SOAPException: Unable to create SAAJ meta-factory: Provider com.sun.xml.internal.messaging.saaj.soap.SAAJMetaFactoryImpl not found. This can be solved by adding the following dependency.

<dependency>
    <groupId>com.sun.xml.messaging.saaj</groupId>
    <artifactId>saaj-impl</artifactId>
    <version>1.5.1</version>
</dependency>

Hope, it helps!

Harisudha
  • 527
  • 5
  • 5
  • 2
    I can confirm that for Java 11 the implementation is missing: `com.sun.xml.messaging.saaj:saaj-impl`. We did not need the `soap-api` definition. – Druckles Jul 21 '20 at 15:05
16

Add the following dependencies, it should work then

<dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.messaging.saaj</groupId>
        <artifactId>saaj-impl</artifactId>
        <version>1.5.0</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.ws</groupId>
        <artifactId>jaxws-api</artifactId>
        <version>2.2.6</version>
    </dependency>

Refer the following links for a running piece of code (SpringBootSOAPWS + Java10) Github- SpringBoot Soap Server Github- SpringBoot Soap Client

Rish
  • 161
  • 1
  • 2
15

I imported this one to sort out the issue: https://mvnrepository.com/artifact/javax.xml.soap/javax.xml.soap-api/1.4.0

McCoy
  • 780
  • 1
  • 10
  • 21
5

Adding this dependency will solve the issue.

    <dependency>
        <groupId>com.sun.xml.messaging.saaj</groupId>
        <artifactId>saaj-impl</artifactId>
        <version>1.5.0</version>
    </dependency>
prisar
  • 3,041
  • 2
  • 26
  • 27
1

The JAX-WS dependency library “jaxws-api.jar” is missing. Try:

  • compile group: 'javax.xml.ws', name: 'jaxws-api', version: '2.3.1' - for gradle or:

    <dependency>
        <groupId>javax.xml.ws</groupId>
        <artifactId>jaxws-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    
0

I know this is already closed for all above people but I am still facing this issue even though I have added jakarta-xml.soap-api and saaj jars in classpath.

Anything that I am missing to make it work.Tried out using javax-.xml-soap-api as well instead of jakarta jar but still same error.Somehow its not able to identify the jar.

  • I know this is a bit late, but are you by chance using the 4.x versions of the Jakarta libraries? I'm currently wrestling with that since Jakarta's package name changed with that version. – David Bradley Mar 31 '23 at 13:28