关于Maven:尽管定义了依赖项,但获取java.lang.ClassNotFoundException:com.sun.xml.internal.ws.spi.ProviderImpl

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

尽管我已经定义了相关的依赖关系(如我在下面添加的那样),但当我的应用程序调用Web服务时却出现了java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl异常。

1
2
3
4
5
6
7
8
9
10
11
12
<dependency>
  <groupId>javax.xml.ws</groupId>
  jaxws-api</artifactId>
  <version>2.2.10</version>
</dependency>

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

p.s。 Servlet容器是Apache Tomcat 9.0.4

p.s。 Java版本:9.0.1


@reta回答的第一部分对我有用。这些是我pom(Java 10)的相关依赖项:

1
2
3
4
5
6
7
8
9
10
<dependency>
  <groupId>javax.xml.ws</groupId>
  jaxws-api</artifactId>
  <version>2.3.1</version>
</dependency>
<dependency>
  <groupId>com.sun.xml.ws</groupId>
  rt</artifactId>
  <version>2.3.1</version>
</dependency>

似乎您可能需要包括以下依赖项:

1
2
3
4
5
<dependency>
    <groupId>com.sun.xml.ws</groupId>
    rt</artifactId>
    <version>2.2.10</version>
</dependency>

或者(尚未检查,但应该可以工作)您可能需要更改范围以导入POM依赖项。

1
2
3
4
5
6
7
<dependency>
  <groupId>com.sun.xml.ws</groupId>
  jaxws-rt</artifactId>
  <version>2.2.10</version>
  <type>pom</type>
  <scope>import</scope>
</dependency>


今天在雅加达时代,我需要以下两个依赖项:

1
2
3
4
5
6
7
8
9
10
11
        <dependency>
            <groupId>jakarta.xml.ws</groupId>
            jakarta.xml.ws-api</artifactId>
            <version>2.3.3</version>
        </dependency>

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

我觉得很奇怪的是,第二个依赖项不是来自Jakarta,我认为所有这些实现都已迁移。它可以工作,但是如果有人可以对此发表评论,我将不胜感激。


似乎类com.sun.xml.internal.ws.spi.ProviderImpljdk-9

中不可用

1
2
3
4
5
6
7
8
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)

在jdk-8中可用,我想知道是否可以使用jdk-8来解决问题。


从Java 8升级到Java 11时遇到了同样的问题。

问题是ForkJoinPool中的行为发生了变化,该类加载器是jdk9系统类加载器,而不是主线程类加载器,它可能产生难以解决的ClassNotFound异常。

最好在此答案中进行解释https://stackoverflow.com/a/59444016/878015