注:這篇文章來自公司內部wiki,之前在碰到這種問題的時候,首先也是去網上搜資料,但發現沒有完整可行的解決方案。這篇文章上列出的解決方案,目前仍在完善中,但已經解決了幾個項目的上線問題,因此將這篇文章分享出來,希望對被同樣問題所困擾的項目組能夠有所幫助。
問題簡介
在日常的開發過程中,我們會經常使用到一些第三方(當然這裏所指的第三方是指非產品或者產品附屬組件,如cxf、Axis2等)的webservice引擎,常見的場景往往是在本地測試過程中(web容器多爲tomcat、jetty、jboss等較爲輕量級的免費服務器)是沒有任何問題的,但是一旦部署到websphere或者weblogic中,就會出現一系列匪夷所思的問題。我們就基於websphere部署環境,講解下問題的解決方法。
基本原因
1、websphere應用服務器中內嵌了其自由的一套JAX-WS引擎,專職提供webservice相關服務。
2、websphere應用服務器JAX-WS引擎引用了一些第三方的包,並且在您的應用也無可避免的引用了這些包,並且部署到websphere容器上時,這些第三方包其實已經加載到websphere的應用服務器中,再次加載會導致衝突。
解決步驟(以CXF爲例)
由問題產生的基本原因所述的兩點,基本確定了問題的處理方法無非兩點:
A、清理應用中的衝突包。
B、禁用websphere自帶的JAX-WS引擎。
清理應用中的衝突包(仍在完善中)
與webpshere衝突的JAX-WS相關的第三方jar包清單如下:
- saaj-api.jar
- saaj-impl.jar
- xalan.jar
- xercesImpl.jar
- apache-xerces-xercesImpl.jar
- xml-apis.jar
- xmlbeans.jar
- jaxb-api.jar
- jaxb-impl.jar
- jaxrpc.jar
- stax-api.jar
- geronimo-stax-api.jar
- activation.jar
在打包完成後,可將這些包從部署包中清除
禁用websphere自帶的JAX-WS引擎
禁用websphere自帶的JAX-WS引擎有兩個步驟,具體如下:
1、禁用server的JAX-WS引擎
設置JVM的參數爲:-Dcom.ibm.websphere.webservices.DisableIBMJAXWSEngine=true
2、調整應用的類加載順序
調整類加載順序爲“父靠後”加載策略,可以保證優先加載CXF相關的webservice,以便能夠替換websphere中與JAX-WS相關的類庫。