websphere上部署基於cxf框架的webservice專案報錯問題的解決方案
注:這篇文章來自公司內部wiki,之前在碰到這種問題的時候,首先也是去網上搜資料,但發現沒有完整可行的解決方案。這篇文章上列出的解決方案,目前仍在完善中,但已經解決了幾個專案的上線問題,因此將這篇文章分享出來,希望對被同樣問題所困擾的專案組能夠有所幫助。
問題簡介
在日常的開發過程中,我們會經常使用到一些第三方(當然這裡所指的第三方是指非產品或者產品附屬元件,如cxf、Axis2等)的webservice引擎,常見的場景往往是在本地測試過程中(web容器多為tomcat、jetty、jboss等較為輕量級的免費伺服器)是沒有任何問題的,但是一旦部署到websphere或者weblogic中,就會出現一系列
基本原因
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相關的類庫。