解決cxf的jar包衝突
伺服器上的jar包是cxf2.0.13,jdk版本是jdk6。不過由於cxf2.0.13能夠找到的資料不多了,所以就想用cxf2.5.2來開發。
這個工作很順利就完成了,然後將程式碼提交到伺服器上,並用cxf2.5.2.jar替換了cxf2.0.13.jar,結果報了以下異常
java.lang.IncompatibleClassChangeError: Implementing class
感覺是jar包衝突,這下悲劇了,伺服器上有100多個jar包,只好逐一排查,最後發現是由於cxf依賴的包版本不一致造成的
cxf2.0.13依賴的是neethi-2.0.4以及XmlSchema-1.4.5,而cxf2.5.2依賴的是neethi-3.0.1以及xmlschema-core-2.0.1
用neethi-3.0.1和xmlschema-core-2.0.1替換之後,服務釋出成功啦!
本以為搞定了,結果跑了一下冒煙測試,又悲劇了,系統裡原來的一個基本功能掛了,跟進去一看,是系統原來的程式碼跟cxf2.5不相容
這下就有2個方案,一個是修改已有的程式碼,使之相容cxf2.5;或者基於cxf2.0,重新寫我們的web service
第一個方案風險太大,因為老程式碼涉及很廣,而且我們都不太熟悉,所以就決定用低版本的cxf包重寫我們的web service
但是cxf2.0的資料實在是很少,官網都不提供了,所以我們稍微升了一點,用cxf2.1
替換試了一下,發現cxf2.1和cxf2.0一樣,也是依賴neethi-2.0.4以及XmlSchema-1.4.5,只是額外依賴一些別的jar包,這樣就直接用cxf2.1替換了cxf2.0.13
然後驗了一下剛才失敗的基本特性,發現可以,看來老程式碼和cxf2.1是相容的,這樣就沒有後顧之憂了
這個時候,我們的web service倒是能釋出,但是呼叫失敗
呼叫的時候報以下異常:
java.lang.IllegalArgumentException: object is not an instance of declaring class
不管怎麼試,都是這個結果
一籌莫展了很長時間,因為這個時候不知道咋改了,程式碼沒有動過,用cxf2.5.2就OK,用cxf2.1就是不行
最後才發現,原來是cxf2.5.2和cxf2.1的配置檔案寫法不一樣
cxf2.5.2的寫法:
<jaxws:endpoint id="remedy" implementorClass="com.huawei.remedy.webservice.impl.RemedyWebServiceCMImpl" address="/RemedyWebService" />
cxf2.1的寫法:
<jaxws:endpoint id="remedy" implementor="com.huawei.remedy.webservice.impl.RemedyWebServiceCMImpl" address="/RemedyWebService" />
區別非常小,就是implementorClass和implementor的區別。。所以很難發現
最後獲得了圓滿的結果,使用cxf2.1,neethi-2.0.4,XmlSchema-1.4.5,相容了老程式碼,新開發的web service也釋出呼叫成功了
總結:
1、cxf早期版本依賴的jar包很多,要用cxf就要引一大堆jar包,新版本基本沒這個問題了
2、各版本cxf核心jar包的組合:
cxf-2.0.13.jar
neethi-2.0.4.jar
XmlSchema-1.4.5.jar
cxf-2.5.2.jar
neethi-3.0.1.jar
xmlschema-core-2.0.1.jar
3、不同版本cxf的配置檔案的寫法有細微的差別