無論是was7還是was8,在安裝帶有Axis2的應用時,都很容易出現jar衝突的情況,最常見的有以下:
E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet 錯誤]-[AxisServlet]: org.apache.axis2.deployment.DeploymentException: org.apache.commons.fileupload.FileUploadException
或者
E com.ibm.ws.webcontainer.webapp.WebApp logServletError SRVE0293E: [Servlet Error]-[AxisServlet]: java.lang.ClassCastException: com.ibm.xml.xlxp2.api.wssec.WSSXMLInputFactory incompatible with javax.xml.stream.XMLInputFactory
was7比was8好解決一點,之前佈署was7時大概查了兩週資料才解決,後來遷到was8時,照was7的方法操作還是不行的,再查了一週資料才搞定,基本上,你看到這篇文章時,你在網上查的大部分文章、官網、資料我都有看過。
was版本 7 Axis2版本1.6.2
下面先從was7的解決方式開始說起
1:把modules下的六個文件
addressing-1.6.2.mar
mex-1.6.2.mar
mtompolicy-1.6.2.mar
ping-1.6.2.mar
scripting-1.6.2.mar
soapmonitor-1.6.2.mar
重命名後綴,把.mar改爲.jar後放入應用lib目錄下
addressing-1.6.2.jar
mex-1.6.2.jar
mtompolicy-1.6.2.jar
ping-1.6.2.jar
scripting-1.6.2.jar
soapmonitor-1.6.2.jar
2:檢查應用中是否有關於javaee的包,如
javaee*.jar
servlet-api-*.jar
有的話,刪掉,打包時不要包含這些jar包,was容器中自帶這些jar包了。
3:檢查應用中是否有關於xmlbeans-*.jar的包,因爲Axis2帶有axis2-xmlbeans-1.6.2.jar了,所以有別的這樣的包,也不用了。
4:最重要的一步
修改Classloader策略,企業應用程序 > 你的應用_war > 管理模塊 > 你的應用.war
修改類裝入器順序 爲: 類已裝入並且是先使用本地類半入器(父類在後) ---相信英文版本也一眼就能看到 - -
行了,was7的現在啓動就沒問題了。
was7解決方案在IBM官方論壇有
http://www-01.ibm.com/support/docview.wss?mhq=axis2&mhsrc=ibmsearch_s&uid=swg21315686
現在進入更爲麻煩的was8佈署,環境爲was8.5, Axis2仍爲1.6.2
先得做完以上was7的操作。
在這裏先列舉一下我所看到的相關資料的解決方法
方案1 (最終結論非必須):
DisableIBMJAXWSEngine: true in the META-INF/MANIFEST.MF
方案2(與1應該是相同作用,最終結論非必須):
應用服務器--》yourserver-->java和進程管理 下的 進程定義--->其他屬性下的 java虛擬機-->其他屬性下的定製屬性,
如果沒有該屬性,則新建之。
com.ibmcom.ibm.websphere.webservices.DisableIBMJAXWSEngine 爲 true
方案3(我的應用沒有,這個不知道):
刪除了項目中的,如果有的話 webserviceclient.jar 和 aopalliance-1.0.jar
方案4(最終結論非必須):
將應用axis2.xml中的EnableChildFirstClassLoading 參數設爲true
方案5 (好像也不是必須)
在安裝war包的第一步操作裏,把部署Web Service這個選項勾上。個人猜測這是was自己用來禁用自帶webservice服務的選項,可能在一定程度上可以解決衝突。
方案6:最重要的一點
共享庫解決方案。
衝突的jar包爲axis2-adb-1.6.2.jar,把它放進共享庫後,應用中的axis2-adb-1.6.2.jar也沒必要刪除,可刪可不刪。
建共享庫時有很多細節需要注意,包不要放多了,也不能放少了,建完共享庫後還要重啓server生效,不止是應用,服務也是得重啓的,節點倒是不用操作,這點非常重要!
下面開始建共享庫以及引用共享庫。
打開菜單環境 - 共享庫 , 選好server作用域,如果是集羣的話選集羣配置,然後點新建菜單
接下來建立你的共享庫,衝突的jar只有一個,axis2-adb-1.6.2.jar,注意選類加載隔離
然後很重要的一點要重啓Server
菜單在服務器-服務器類型-
選中你應用部署的Server重啓,讓共享庫生效。
然後進應用綁定共享庫
綁定完後,後退就可以看到引用到共享庫了。至此結束。
這時候啓動應用,就正常了。
WAS運行時的類加載順序,可以去下面這個菜單看看
企業應用程序 >你的應用_war > 管理模塊 > 你的應用.war > 查看類裝入器(選擇服務器) > 類裝入器查看器
可以導出文件看下
至此所有問題解決。
現在就只剩一個問題,是如何知道導致衝突的是axis2-adb-1.6.2.jar