关于WebSphere 6.1类加载问题的CXF

时间:2011-05-11 23:00:08

标签: java websphere classloader cxf

我有一个具有以下配置的项目:

  • WebSphere Application Server 6.1.0.19
  • wsdl4j-1.6.2.jar 位于$WAS_ROOT/java/jre/lib/ext目录,(覆盖WAS 6.1中包含的wsdl4j-1.6.1)。
  • cxf-2.4.0.jar (以及其他依赖项)位于$WAS_ROOT/lib/ext目录。
  • EAR'X'网络模块'Y'
  • 网络模块'Y'有一个 JAR模块'Z'(位于WEB-INF/lib目录)。
  • 'Z'有一组实现使用CXF的wsdl2java生成的SOAP Web服务的类。
  • 'Y'有一个业务类(在WEB-INF/classes目录下),它在'Z'处调用SOAP Web服务客户端。

此配置适用于我的开发环境(带有WebSphere AS 6.1运行时的Rational Application Developer)。但是在质量保证环境中,我有以下例外情况(请注意堆栈跟踪中的粗体):

org.apache.cxf.bus.extension.ExtensionException
at org.apache.cxf.bus.extension.Extension.loadInterface(Extension.java:134)
at org.apache.cxf.bus.extension.ExtensionManagerImpl.loadAndRegister(ExtensionManagerImpl.java:160)
at org.apache.cxf.bus.extension.ExtensionManagerImpl.getBeansOfType(ExtensionManagerImpl.java:256)
at org.apache.cxf.bus.CXFBusImpl.getExtension(CXFBusImpl.java:99)
at org.apache.cxf.endpoint.ClientImpl.notifyLifecycleManager(ClientImpl.java:186)
at org.apache.cxf.endpoint.ClientImpl.(ClientImpl.java:117)
at org.apache.cxf.frontend.ClientFactoryBean.createClient(ClientFactoryBean.java:104)
at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:92)
at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:152)
at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:142)
at org.apache.cxf.jaxws.ServiceImpl.createPort(ServiceImpl.java:464)
at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:331)
at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:318)
at javax.xml.ws.Service.getPort(Service.java:46)
at web.service.client.implementation.at.z.module.method(Unknown Source)
at business.class.at.y.web.module.method(AvisoCobroDAO.java:86)
... 32 more
Caused by: java.lang.ClassNotFoundException: org.apache.cxf.endpoint.ClientLifeCycleManager
at com.ibm.ws.classloader.CompoundClassLoader.findClass(CompoundClassLoader.java:472)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:373)

at java.lang.ClassLoader.loadClass(ClassLoader.java:561)
at org.apache.cxf.bus.extension.Extension.loadInterface(Extension.java:132)
... 51 more

似乎CompoundClassLoader(在应用程序级别工作)正在尝试加载存在于服务器运行时级别的CXF类。

我希望有人帮我解决这个问题。我将非常感激。

1 个答案:

答案 0 :(得分:1)

将Jars放在WAS_HOME / lib / ext中应该是你最后的选择。

始终尝试PARENT_LAST类加载器模式并首先拾取您的类/ jar。

这样可以避免一些问题。

App Server启动会广泛使用此目录,如果存在冲突,它甚至可能无法启动。

排除故障的最佳方法是打开类加载并查看native_stdout / stderr文件,看看谁正在加载有问题的类。

Bkail,

你的意思是不同的说法吗?此路径位于类加载器链的高位,因此将在之前(使用默认的PARENT_FIRST)类加载策略进行检查。

这将在第二个梯级(在JDK的BOOT CLassloader之后)和它的扩展。

HTH

Manglu