ServiceConfigurationError 由 WebSphere 中的 LinkageError 导致



我有一个部署在 WebSphere 9.0.5.2 上的应用程序,我想在其中使用 CXF 进行 Web 服务调用,并且我得到了这个 此服务配置错误

WrapperedException { java.util.ServiceConfigurationError: javax.xml.ws.spi.Provider: Provider org.apache.cxf.jaxws.spi.ProviderImpl could not be instantiated 

在堆栈跟踪的更下方,我看到这是由链接错误引起的

Caused by: java.lang.LinkageError: loading constraint violation when overriding method
"javax/xml/ws/spi/ServiceDelegate.createDispatch(Ljavax/xml/namespace/QName;Ljavax/xml/bind/JAXBContext;Ljavax/xml/ws/Service$Mode;)Ljavax/xml/ws/Dispatch;" during creation of class
"org/apache/cxf/jaxws/ServiceImpl": loader
"com/ibm/ws/classloader/CompoundClassLoader@832133d2" of class
"org/apache/cxf/jaxws/ServiceImpl" and loader
"com/ibm/oti/vm/BootstrapClassLoader@2eec706a" of class
"javax/xml/ws/spi/ServiceDelegate" have different types for the method signature 

我知道这可能是由多个库引起的,这些库对QNameJAXBContext有不同的定义,但我想我已经排除了这些。

我也知道 WebSphere 有自己的 JAX-WS,它有自己的 ServiceDelegate.createDispatch 方法签名,并且我尝试按照此处的说明在 WebSphere 中将DisableIBMJAXWSEngine设置为 true

。使用第三方 JAX-WS Web 服务引擎

我仍然无法摆脱错误,并且几乎不知道下一步该尝试什么。 任何建议不胜感激!!

这里的问题是应用程序和服务器 JAXB API、JAX-WS API 和 JAX-WS 实现的副本之间的交叉链接。应用程序(配置了父类最后一个类装入委派,因此它在委派给父类之前在本地搜索(包含 JAX-WS 实现和 JAXB API/impl,但它不包含 JAX-WS API。由于 JAX-WS 引用 JAXB,我们得到以下链接模式:

1( 某些应用程序类引用 JAX-WS API。由于它未打包在应用程序中,因此它是从服务器库加载的。

2( 当 API 类被链接时,它使用其本地类加载器来查找 JAXB API。反过来,这也将其链接到服务器的版本。

3( JAX-WS 使用线程上下文类装入器来加载其实现。它在父级最后一个应用程序中找到它。

4( 当实现类被链接时,它使用其本地类加载器来查找 JAXB API,JAXB API 在应用程序中本地找到它。

5( 实现现在链接到同一类的两个版本:

JAXWSImpl -> JAXWSAPI -> JAXB (server( JAXWSImpl -> JAXB (app(

JVM不能容忍这种情况,并且抛出了一个LinkageError。

可以通过以下两种方式之一找到解决方案:

1( 将 JAX-WS API 添加到应用程序中 - 这可以防止上面 #1 中的初始委派

2( 从应用程序中删除 JAXB API(以及实现,如果提供( - 这会导致 #4 中的链接委托给 JAXB 的服务器,因此它始终从同一位置加载。

无论哪种方式,诀窍都是确保所有必需的类都可以通过相同的类装入器提供给应用程序。

最新更新