2011-05-11 103 views
0

我有以下配置的項目:CXF在WebSphere 6.1類加載問題

  • 的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'Web模塊'Y'
  • Web模塊'Y'有一個JAR模塊'Z'(位於WEB-INF/lib目錄)。
  • 'Z'有一組類實現使用CXF的wsdl2java生成的SOAP Web服務。
  • 'Y'有一個業務類(位於WEB-INF/classes目錄),它在'Z'處調用SOAP Web服務客戶機。

該配置在我的開發環境(Rational Application Developer和WebSphere AS 6.1運行時)下運行良好。但在QA環境,我有以下異常,(請加粗關注的堆棧跟蹤):

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的類存在於服務器運行時級別。

我希望有人能幫我解決這個問題。我會非常感激。

+0

哪裏ClientLifecycleManager類在什麼位置?它在cxf-2.4.0.jar中嗎?請注意,將JAR放入WAS_HOME/lib/ext /中實際上並不會覆蓋WAS類,因爲該目錄中的jar包是類路徑的末尾,而WAS擴展類加載器使用「父級第一」類加載。 – 2011-05-12 00:27:01

回答

1

在WAS_HOME/lib/ext中放置Jars應該是您的最後一招。

總是嘗試PARENT_LAST類加載器模式,並讓您的類/ jar首先被拾取。

這會爲您避免一些問題。

應用服務器啓動將廣泛使用此目錄,如果有衝突,它甚至可能不會啓動。

解決問題的最佳方法是啓用類加載並查看native_stdout/stderr文件,並查看誰加載了有問題的類。

Bkail,

您的意思是說不同的事情嗎?這個路徑在類加載器鏈中是高的,所以它會在早期檢查(使用默認的PARENT_FIRST)類加載策略。

這將在第二個梯級(在JDK的BOOT CLassloader之後)以及它的擴展。

HTH

Manglu

+0

@bkail,@Manglu,謝謝你的迴應。 @Manglu,你把罐子放在'WAS_HOME/lib/ext'上是對的,事實上'Z'罐子模塊包含其他項目所需的其他業務類,我不能把它放在更高的層次上,因爲可能有不同的版本在服務器的不同項目中。好的新功能是這種哀悼,我啓用Class Loader Visor,重新啓動服務器並運行業務規則,它的工作原理!黑魔法?我永遠不會知道...... – 2011-05-12 14:42:20