【问题标题】:Class loading issue involving CXF on Websphere, parent last not helpingWebsphere 上涉及 CXF 的类加载问题,父级最后没有帮助
【发布时间】:2012-12-13 22:33:14
【问题描述】:

我的问题是 CXF 和 wsdl4j_1.6.2.jar 与某些东西发生碰撞,大概是 axis-wsdl4j.jar。

我已阅读:What's wrong with my Apache CXF client?

我的项目中没有包含战争中的axis-wsdl4j.jar。我还要求我们的管理员将 Websphere 切换到 Parent Last。我还是明白了:

[12/13/12 16:01:28:378 CST] 0000001b ServletWrappe E SRVE0068E: 的服务方法之一中抛出未捕获的异常 小服务程序:CXFServlet。抛出异常:java.lang.RuntimeException: org.apache.cxf.interceptor.Fault: javax/wsdl/xml/WSDLReader.readWSDL(Ljavax/wsdl/xml/WSDLLocator;Lorg/w3c/dom/Element;) Ljavax/wsdl/定义; 在 org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:116) 在 org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:322) 在 org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:122) 在 org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:211) 在 org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:213) 在 org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:154) 在 org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:129) 在 org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:187) 在 org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:110) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:763) 在 org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:166) 在 com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1143) 在 com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:591) 在 com.ibm.ws.wswebcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:481) 在 com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3453) 在 com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:267) 在 com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:815) 在 com.ibm.ws.wswebcontainer.WebContainer.handleRequest(WebContainer.java:1466) 在 com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:119) 在 com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:458) 在 com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewInformation(HttpInboundLink.java:387) 在 com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:267) 在 com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214) 在 com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113) 在 com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165) 在 com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) 在 com.ibm.io.async.AsyncChannelFuture$1.run(AsyncChannelFuture.java:205) 在 com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1473) 引起:org.apache.cxf.interceptor.Fault: javax/wsdl/xml/WSDLReader.readWSDL(Ljavax/wsdl/xml/WSDLLocator;Lorg/w3c/dom/Element;)Ljavax/wsdl/Definition; 在 org.apache.cxf.service.invoker.AbstractInvoker.createFault(AbstractInvoker.java:162) 在 org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:128) 在 org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:167) 在 org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:94) 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58) 在 org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:94) 在 org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262) ... 26 更多原因:java.lang.NoSuchMethodError: javax/wsdl/xml/WSDLReader.readWSDL(Ljavax/wsdl/xml/WSDLLocator;Lorg/w3c/dom/Element;)Ljavax/wsdl/Definition; 在 org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:242) 在 org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:191) 在 org.apache.cxf.wsdl11.WSDLServiceFactory.(WSDLServiceFactory.java:92) 在 org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:203) 在 org.apache.cxf.jaxws.ServiceImpl.(ServiceImpl.java:147) 在 org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:97) 在 javax.xml.ws.Service.(Service.java:35) ...

项目由 Maven 构建,仅通过 Continuum 部署到 Websphere;并且所有设置都通过请求更改。应用程序在本地 Tomcat 上完美运行。

编辑: 最终通过以下方式解决了这个问题:

  1. 将 wsdl4j.jar 复制到 /usr/WebSphere/AppServer/appLibs/APPNAME 目录。
  2. 以前的 Chmod 775。
  3. 在 websphere 管理控制台中,环境(左侧),共享库,并在上面定义一个名称为 APPNAME 的容器范围的共享库。
  4. 将 jar 添加到共享库的类路径中。
  5. 服务器(左侧)、APPNAME java、进程管理、类加载器,并确保“首先使用应用程序类加载器加载类”
  6. 单击类加载器并将共享库分配给它。
  7. 重启服务器

【问题讨论】:

    标签: websphere cxf nosuchmethoderror


    【解决方案1】:

    我认为您需要禁用 Jax ws 引擎

    尝试如下设置 JVM 属性

    com.ibm.websphere.webservices.DisableIBMJAXWSEngine=true
    

    【讨论】:

    • 我确实尝试将:DisableIBMJAXWSEngine: true 添加到 Manifest.MF 但它没有任何影响。下次我会试试的。
    【解决方案2】:

    这就是我要做的。

    在 WAS 运行时打开详细类加载并查看包含 WSDLReader 的 JAR。

    根据详细的类加载检查这是否是您希望在运行时(开始时)使用的 JAR。

    HTH

    【讨论】:

    • 我假设您的意思是将-Dibm.cl.verbose=ClassToTrace WSDLReader 传递给jvm?
    最近更新 更多