我們在實際環境中Web服務客戶最近得到了異常:的NoClassDefFoundError爲com.sun.xml.internal.ws.fault.SOAPFaultBuilder
java.lang.NoClassDefFoundError: Could not initialize class com.sun.xml.internal.ws.fault.SOAPFaultBuilder
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:107)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:135)
at com.sun.proxy.$Proxy146.search(Unknown Source)
....
我已經做了很多搜索的在線,其中包括幾張貼在這裏的StackOverflow:
Catching webservice exception with CXF: NoClassDefFoundError: SOAPFaultBuilder
Could not initialize class com.sun.xml.internal.ws.fault.SOAPFaultBuilder
我的理解是我們的客戶端從服務器收到一個SOAP Fault,它缺少一些jar文件。所以我試圖通過重新創建來解決這個問題。
我在Eclipse中創建了一個簡單的Web服務服務器項目,它有一個web方法拋出一個簡單的錯誤類@WebFault
註釋。然後我創建了一個簡單的Web服務客戶端項目,它使用Web方法。客戶端項目的類路徑中沒有任何額外的庫/ jar;它只有JRE。令我驚訝的是,它沒有拋出NoClassDefFoundError異常!相反,我得到了我在服務器端定義的javax.xml.ws.soap.SOAPFaultException
。
該類SOAPFaultBuilder
確實在JRE的rt.jar中。所以我創建的簡單的Web服務項目可能就像他們應該做的那樣工作。但是,在我們的現場環境中,Web服務客戶端如何拋出NoClassDefFoundError
異常?該項目在類路徑中肯定有rt.jar。
任何人都可以請解釋一下這個問題?如果它缺少一些jar文件(來自jaxws RI或Apache CXF或其他),爲什麼我創建的超級簡單客戶端不會拋出錯誤?實時環境和本地環境都使用Java7u51。
我在這篇文章後學到的一件事是'java.lang.ClassNotFoundException'和'java.lang.NoClassDefFoundError'之間的區別。在這種情況下,問題可能是因爲'SOAPFaultBuilder'由於其他原因未能初始化。不幸的是,我沒有在我們的生產日誌中發現其他例外情況。現在,我將嘗試通過在類路徑中添加'jaxws-api.jar','jaxws-rt.jar','jaxws-tools.jar'和'saaj-impl.jar'來解決這個問題。帖子建議。 – xli 2015-02-25 16:39:57
我使用的是帶有RS-libs的TomEE ......但也有這個問題... @xli你有沒有任何進展,因爲你從事這個工作? – FibreFoX 2015-09-29 15:15:06
@FibreFoX並不多。您可以嘗試添加這些JAR以查看是否有幫助。我最終刪除了那些JAR,因爲它們在我們的系統中引起了一些依賴性問題。 – xli 2015-10-06 21:06:56