简体   繁体   中英

Getting java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl despite the dependencies are defined

Despite that I have defined the related dependencies as I have added below, getting the java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl exception when my app makes a call to the web service.

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

<dependency>
  <groupId>com.sun.xml.ws</groupId>
  <artifactId>jaxws-rt</artifactId>
  <version>2.2.10</version>
  <type>pom</type>
</dependency>

ps The servlet container is Apache Tomcat 9.0.4 .

ps Java version: 9.0.1 .

The first part of the answer by @reta works for me. These are the relevant dependencies from my pom (Java 10):

<dependency>
  <groupId>javax.xml.ws</groupId>
  <artifactId>jaxws-api</artifactId>
  <version>2.3.1</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.ws</groupId>
  <artifactId>rt</artifactId>
  <version>2.3.1</version>
</dependency>

It seems like you may need to include this dependency:

<dependency>
    <groupId>com.sun.xml.ws</groupId>
    <artifactId>rt</artifactId>
    <version>2.2.10</version>
</dependency>

Or (haven't checked it yet but should work) you may need to change the scope to import for POM dependency.

<dependency>
  <groupId>com.sun.xml.ws</groupId>
  <artifactId>jaxws-rt</artifactId>
  <version>2.2.10</version>
  <type>pom</type>
  <scope>import</scope> 
</dependency>

Today in the era of Jakarta, I needed the following two dependencies:

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

        <dependency>
            <groupId>com.sun.xml.ws</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.3.3</version>
        </dependency>

One thing I find quite weird is that the second dependency is not from Jakarta, I thought all of these implementations were migrated. It works, but I'd appreciate if someone could comment on that.

Seems like the class com.sun.xml.internal.ws.spi.ProviderImpl is not available in jdk-9

jshell> Class.forName("com.sun.xml.internal.ws.spi.ProviderImpl")
|  java.lang.ClassNotFoundException thrown: com.sun.xml.internal.ws.spi.ProviderImpl
|        at URLClassLoader.findClass (URLClassLoader.java:466)
|        at DefaultLoaderDelegate$RemoteClassLoader.findClass (DefaultLoaderDelegate.java:66)
|        at ClassLoader.loadClass (ClassLoader.java:543)
|        at ClassLoader.loadClass (ClassLoader.java:476)
|        at Class.forName0 (Native Method)
|        at Class.forName (Class.java:292)
|        at (#1:1)

which is available in jdk-8, I wonder if you can use jdk-8 if possible might solve the issue.

I've got the same problem upgrading to Java 11 from Java 8.

The problem was change of behavior in ForkJoinPool , which classloader is as of jdk9 system classloader, not the main thread classloader, it can produce hard to solve ClassNotFound exceptions.

It's better explained in this answer https://stackoverflow.com/a/59444016/878015

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM