迁移到雅加达:ClassNotFoundException:com.sun.xml.internal.ws.spi.ProviderImpl

use*_*772 1 soap java-11 jakarta-ee

根据https://wiki.eclipse.org/New_Maven_Coordinates和Maven Central从Java 8迁移到Java 11并从EE切换到最新的Jakarta库时,我们在(仍基于SOAP的)客户端应用程序中获得了以下运行时异常:

Exception in thread "main" javax.xml.ws.WebServiceException: Provider com.sun.xml.internal.ws.spi.ProviderImpl not found
        at javax.xml.ws.spi.FactoryFinder$1.createException(FactoryFinder.java:31)
        at javax.xml.ws.spi.FactoryFinder$1.createException(FactoryFinder.java:28)
        at javax.xml.ws.spi.ServiceLoaderUtil.newInstance(ServiceLoaderUtil.java:73)
        at javax.xml.ws.spi.FactoryFinder.find(FactoryFinder.java:82)
        at javax.xml.ws.spi.Provider.provider(Provider.java:66)
        at javax.xml.ws.Service.<init>(Service.java:82)
        at [...]
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        at javax.xml.ws.spi.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:60)
        at javax.xml.ws.spi.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:93)
        at javax.xml.ws.spi.ServiceLoaderUtil.newInstance(ServiceLoaderUtil.java:71)
        ... 5 more
Run Code Online (Sandbox Code Playgroud)

尽管定义了依赖项,但获取java.lang.ClassNotFoundException:com.sun.xml.internal.ws.spi.ProviderImpl中描述的解决方案不起作用,也不使用Jakarta。

如果我没看错,则Jarkarta库中不应包含“ com.sun.xml。”包或此类引用,但javax.xml.ws.spi.Provider显然仍会引用此类:

private static final String DEFAULT_JAXWSPROVIDER =
        "com.sun"+".xml.internal.ws.spi.ProviderImpl";
Run Code Online (Sandbox Code Playgroud)

那么,有谁知道是否有一个与缺少的包含ProviderImpl的库等效的Jakarta,或者我如何解决Jakarta的问题?

提前致谢!

小智 6

因为我遇到了“同样的问题”,所以我把我的 5 美分投入了戒指中。对我来说解决这个问题的是坚持使用 jaxws-rt 包的第二版,因为版本 3.0.0 确实失败了,结果与上面提到的相同。

所以我用来让我的 JDK 8 源代码在不做任何修改的情况下运行的是:


// https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-rt
    implementation group: 'com.sun.xml.ws', name: 'jaxws-rt', version: '2.3.3' //3.0.0 did not work!

    // https://mvnrepository.com/artifact/javax.xml.ws/jaxws-api
    implementation group: 'javax.xml.ws', name: 'jaxws-api', version: '2.3.1'
    
    // https://mvnrepository.com/artifact/javax.jws/javax.jws-api
    implementation group: 'javax.jws', name: 'javax.jws-api', version: '1.1'
Run Code Online (Sandbox Code Playgroud)


use*_*772 5

我终于找到了解决我的问题的方法。根据如何在Java 11上使用WebServices中给出的答案软件包javax.jws不存在,Java 11应该包含JAX-WS的参考实现:

<dependency>
  <groupId>com.sun.xml.ws</groupId>
  <artifactId>jaxws-ri</artifactId>
  <version>2.3.2</version>
  <type>pom</type>
</dependency>
Run Code Online (Sandbox Code Playgroud)

不幸的是,使用最新的maven-compile-plugin 3.8.0以这种依赖关系编译我们的项目会导致https://jira.apache.org/jira/browse/MCOMPILER-355中描述的异常。它应该在3.8.1中修复,但是该版本尚不可用。

作为一种变通方法我得到了我们的项目,给出的提示工作获得抛出java.lang.ClassNotFoundException:com.sun.xml.internal.ws.spi.ProviderImpl尽管依赖的定义,有一个额外的依赖(即合并解析器,这也是链接到jaxws-ripom.xml中),以避免随后出现java.lang.ClassNotFoundException:com.sun.org.apache.xml.internal.resolver.CatalogManager

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

<dependency>
    <groupId>com.sun.org.apache.xml.internal</groupId>
    <artifactId>resolver</artifactId>
    <version>20050927</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

也许这可以帮助遇到相同问题的人。

  • 问候!我自己刚刚遇到这个问题并尝试了您的解决方法,但仍然遇到问题。有关如何解决这个确切问题的任何更新吗?我尝试使用所有不同类型的依赖项和版本,但 Provider.class 仍然指向错误的 ProviderImpl.class。谢谢! (4认同)