CXF 客户端链接错误
Linkage error with CXF client
我正在尝试在 ESB 服务器上设置应用程序。我们有一个包含我们需要的所有依赖项的 OSGi 包,但我们现在遇到了一个奇怪的问题。在运行时,服务器将无法为我们的应用服务器实例化 CXF 客户端。堆栈跟踪是
java.lang.LinkageError: loader constraint violation: when resolving method "javax.xml.ws.Service.<init>(Ljava/net/URL;Ljavax/xml/namespace/QName;)V" the class loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) of the current class, mil/sddc/fltmgt/ws/api/FleetManagementWSServiceService, and the class loader (instance of <bootloader>) for resolved class, javax/xml/ws/Service, have different Class objects for the type <init> used in the signature
at mil.sddc.fltmgt.ws.api.FleetManagementWSServiceService.<init>(FleetManagementWSServiceService.java:39)
at mil.sddc.ibs.mediators.fleetManagement.TestClient.mediate(TestClient.java:28)
at org.apache.synapse.mediators.ext.ClassMediator.mediate(ClassMediator.java:78)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131)
at org.apache.synapse.rest.Resource.process(Resource.java:297)
at org.apache.synapse.rest.API.process(API.java:341)
at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:76)
at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:63)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:220)
at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:83)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:344)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:168)
at org.apache.axis2.transport.base.threads.NativeWorkerPool.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
我之前没有看到这个特定的堆栈跟踪,但看起来 WSO2 的启动 classloader 都提供了 FleetManagementWSServiceService、Service 或两者的实例,导致冲突。
听起来 WSO2 的启动 classloader 和我的 OSGi bundle 的 classloader 都提供 FleetManagementWSServiceService、Service 或两者。大概它必须是服务,因为即使我不小心把那个 class 放在一个 jar 中,启动 classloader 应该总是喜欢 OSGi 包中的那个。
另一个 class、javax.xml.ws.Service 以及其他一些 jar 包含在 Java 运行时中。我在服务器上的 endorsed 文件夹中找到了一个带有它的 geronimo jaxws jar 并删除了它以防万一,但这并不影响构建。
我假设您同时安装了 CXF 和 Axis2。这是行不通的。堆栈跟踪显示 Axis2 被触发以启动您的客户端,但它与已安装的 CXF 冲突。
所以解决方案是只安装 Axis2 或 CXF。
当我发布这篇文章时,我认为问题出在服务器上缺少依赖项,但事实证明我们实际上缺少 OSGi 包中的依赖项。通过包括一个包含 javax.xml.ws.Service 的 geronimo-jaxws jar,这个问题得到了解决。
据我所知,Axis2 和 CXF 的问题几乎是转移注意力的问题。捆绑包中仍然存在 CXF 依赖项,服务器仍在使用 Axis2 调用我们的 类。 '尽管如此,还是感谢您的帮助!
我正在尝试在 ESB 服务器上设置应用程序。我们有一个包含我们需要的所有依赖项的 OSGi 包,但我们现在遇到了一个奇怪的问题。在运行时,服务器将无法为我们的应用服务器实例化 CXF 客户端。堆栈跟踪是
java.lang.LinkageError: loader constraint violation: when resolving method "javax.xml.ws.Service.<init>(Ljava/net/URL;Ljavax/xml/namespace/QName;)V" the class loader (instance of org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader) of the current class, mil/sddc/fltmgt/ws/api/FleetManagementWSServiceService, and the class loader (instance of <bootloader>) for resolved class, javax/xml/ws/Service, have different Class objects for the type <init> used in the signature
at mil.sddc.fltmgt.ws.api.FleetManagementWSServiceService.<init>(FleetManagementWSServiceService.java:39)
at mil.sddc.ibs.mediators.fleetManagement.TestClient.mediate(TestClient.java:28)
at org.apache.synapse.mediators.ext.ClassMediator.mediate(ClassMediator.java:78)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131)
at org.apache.synapse.rest.Resource.process(Resource.java:297)
at org.apache.synapse.rest.API.process(API.java:341)
at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:76)
at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:63)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:220)
at org.apache.synapse.core.axis2.SynapseMessageReceiver.receive(SynapseMessageReceiver.java:83)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:344)
at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:168)
at org.apache.axis2.transport.base.threads.NativeWorkerPool.run(NativeWorkerPool.java:172)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
我之前没有看到这个特定的堆栈跟踪,但看起来 WSO2 的启动 classloader 都提供了 FleetManagementWSServiceService、Service 或两者的实例,导致冲突。
听起来 WSO2 的启动 classloader 和我的 OSGi bundle 的 classloader 都提供 FleetManagementWSServiceService、Service 或两者。大概它必须是服务,因为即使我不小心把那个 class 放在一个 jar 中,启动 classloader 应该总是喜欢 OSGi 包中的那个。
另一个 class、javax.xml.ws.Service 以及其他一些 jar 包含在 Java 运行时中。我在服务器上的 endorsed 文件夹中找到了一个带有它的 geronimo jaxws jar 并删除了它以防万一,但这并不影响构建。
我假设您同时安装了 CXF 和 Axis2。这是行不通的。堆栈跟踪显示 Axis2 被触发以启动您的客户端,但它与已安装的 CXF 冲突。
所以解决方案是只安装 Axis2 或 CXF。
当我发布这篇文章时,我认为问题出在服务器上缺少依赖项,但事实证明我们实际上缺少 OSGi 包中的依赖项。通过包括一个包含 javax.xml.ws.Service 的 geronimo-jaxws jar,这个问题得到了解决。
据我所知,Axis2 和 CXF 的问题几乎是转移注意力的问题。捆绑包中仍然存在 CXF 依赖项,服务器仍在使用 Axis2 调用我们的 类。 '尽管如此,还是感谢您的帮助!