【发布时间】:2017-07-09 06:42:58
【问题描述】:
我正在尝试在 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$1.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 的启动类加载器都提供了 FleetManagementWSServiceService、Service 或两者的实例,从而导致冲突。
听起来 WSO2 的启动类加载器和我的 OSGi 包的类加载器都提供 FleetManagementWSServiceService、Service 或两者。大概它必须是服务,即使我不小心将那个类放在一个 jar 中,它会被启动类加载器拾取,OSGi 包中的那个应该总是受到青睐。
另一个类 javax.xml.ws.Service 包含在 Java 运行时以及其他一些 jar 中。我在服务器的 endorsed 文件夹中找到了一个带有它的 geronimo jaxws jar,并删除了它以防万一,但这并不影响构建。
【问题讨论】:
-
我没有看到 CXF 参与此堆栈跟踪。看来您正在使用 Axis2。请更新您的问题。
-
CXF 的唯一相关性是此异常发生在 CXF 客户端的实例化上。 FleetManagementWSServiceService 是一个自动生成的 CXF 服务,因此扩展了 javax.xml.ws.Service。我认为问题的根源是 WSO2 服务器中的依赖项冲突,但我不知道是哪个。