Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JDK 11: java.lang.NoClassDefFoundError: javax/xml/ws/handler/soap/SOAPHandler

Tags:

java

We are migrating to openjdk 11 from jdk 8. Some of our projects that uses soap to call third party apis are failing with error:

java.lang.NoClassDefFoundError: javax/xml/ws/handler/soap/SOAPHandler

After doing some research, I tried by adding dependencies :

[ references:

  • How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9

  • Replacements for deprecated JPMS modules with Java EE APIs

]

 <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
    </dependency>
    <dependency>
        <groupId>xml-apis</groupId>
        <artifactId>xml-apis</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.1</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.soap</groupId>
        <artifactId>javax.xml.soap-api</artifactId>
        <version>1.3.5</version>
    </dependency>

Did not work. may I get an idea on the alternatives?

like image 208
VictorGram Avatar asked Dec 05 '18 23:12

VictorGram


3 Answers

Include jaxws-api in your dependencies:

<dependency>
    <groupId>javax.xml.ws</groupId>
    <artifactId>jaxws-api</artifactId>
    <version>2.3.1</version>
</dependency>
like image 161
David Conrad Avatar answered Nov 04 '22 18:11

David Conrad


The javax APIs were transitioned to Jakarta, so in 2020 the proper dependency is the following:

<dependency>
    <groupId>jakarta.xml.ws</groupId>
    <artifactId>jakarta.xml.ws-api</artifactId>
    <version>2.3.3</version>
</dependency>

Here's an article summarizing what happened: Java Magazine - Transition from Java EE to Jakarta EE

And here's a very useful table with mappings between the old artifacts and the new one.

like image 40
JohnEye Avatar answered Nov 04 '22 17:11

JohnEye


Since this is the first result on google, my issue was due to having a jar, that required javax.xml.ws classes, on the Tomcat common folder /usr/local/tomcat/lib.

The Tomcat classloader hierarchy is

      Bootstrap
          |
       System
          |
       Common
       /     \
  Webapp1   Webapp2 ...

On Java 8 the common classloader can load these classes since they are on Java JRE itself, but on Java 11, the javax.xml.ws classes are on Webapp1, and the Tomcat common classloader can not load these.

For me, the solution was to no longer deploy the jar into the Tomcat common lib folder.

like image 1
froque Avatar answered Nov 04 '22 18:11

froque