迁移到Jakarta:ClassNotFoundException:com.sun.xml.internal.ws.spi.ProviderImpl

问题描述 投票:0回答:1

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

Getting java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl despite the dependencies are defined中描述的解决方案不起作用,不使用雅加达。

如果我没错,Jarkarta库不应该包含“com.sun.xml。”包或引用,但是javax.xml.ws.spi.Provider显然仍然会引用这样的类:

private static final String DEFAULT_JAXWSPROVIDER =
        "com.sun"+".xml.internal.ws.spi.ProviderImpl";

那么,有没有人知道雅加达是否相当于包含ProviderImpl的丢失库,或者我如何解决雅加达的问题?

提前致谢!

soap java-11 jakarta-ee
1个回答
3
投票

我终于找到了解决问题的方法。根据How to use WebServices on Java 11? package javax.jws does not exist给出的答案,JAX-WS的参考实现应该包含在Java 11中:

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

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

作为一种解决方法,我让我们的项目使用Getting java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl despite the dependencies are defined中给出的提示,并结合了一个额外的依赖项(也就是在jaxws-ri的pom.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>

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

© www.soinside.com 2019 - 2024. All rights reserved.