繁体   English   中英

获取 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异常。

<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 servlet 容器是Apache Tomcat 9.0.4

ps Java 版本: 9.0.1

@reta 回答的第一部分对我有用。 这些是来自我的 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>

似乎您可能需要包含此依赖项:

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

或者(还没有检查过但应该可以工作)您可能需要更改要为 POM 依赖项导入的范围。

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

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

        <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>

我觉得很奇怪的一件事是第二个依赖项不是来自雅加达,我认为所有这些实现都已迁移。 它有效,但如果有人能对此发表评论,我将不胜感激。

似乎类com.sun.xml.internal.ws.spi.ProviderImpljdk-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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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