2013-05-17 107 views
1

我正在使用netbeans從WSDL文檔生成Web服務客戶端。Jar未使用包含的類或名稱空間衝突

客戶工作得很好,直到我們把它放到我們的生產環境中。這些jar是從jaxws-api.jar和jaxb-api.jar中針對javax.ws.xxxxx類生成的,我們將它們放在生產類路徑中。

在我們的生產環境中,我們有其他依賴於xfire庫的代碼。當我們嘗試實例化SubmissionAPI()時,我們得到一個NoClassDefFound異常。我正在粘貼下面的堆棧跟蹤。

UBLSoapTest類似乎調用正確的'Service'類,但'Service'類 正在調用org.codehaus.xfire.jaxws.Provider。

我檢查了javax.xml.ws.Service的源代碼,它有'import javax.xml.ws.spi.Provider'

我們已經嘗試將jar與javax.xxxx類組合起來,仍然得到相同的結果。我懷疑我們需要在清單文件中設置類路徑,但我不確定需要在那裏。

FAIL: Exception: java.lang.NoClassDefFoundError: Could not initialize class 
org.codehaus.xfire.jaxws.JAXWSHelper 
org.codehaus.xfire.jaxws.ServiceDelegate.<init>(ServiceDelegate.java:33) 
org.codehaus.xfire.jaxws.ServiceDelegate.<init>(ServiceDelegate.java:53) 
org.codehaus.xfire.jaxws.Provider.createServiceDelegate(Provider.java:32) 
javax.xml.ws.Service.<init>(Service.java:56) 
org.ubl.soap.test.SubmissionAPI.<init>(SubmissionAPI.java:44) 

即使從這裏看,我有點茫然。

我們已經嘗試在清單中設置classpath,但收效甚微。

我們已經基本罐子結構的嘗試是:

/org/xxxx 
/META-INF/xxx 

/org/xxx 
/META-INF/xxx 
/javax/xxx 

/org/xxx 
/META-INF/xxx 
/jaxws-api.jar 
/jaxb.jar 

回答

1

看來,你缺少的JAX-WS的IMPL罐子。如果你依靠Codehaus提供impl,你可能想確保他們的impl工作。根據他們的網站,這是一個新支持的組件。

另一種方法是提供您自己的impl jar並將其放入類路徑中,以便在此處找到JAX-WS接口。但通常,您部署Web服務應用程序的應用程序服務器應在其類路徑中包含impl。

+0

感謝您的回答!這兩個api罐子不是impl嗎?如果沒有,我們是否需要從javaws-ri下載中複製整個/ lib文件夾?或者是其他東西? (很明顯,xfire不適用於此版本) – lavajumper

+0

通常,任何名稱爲「api」的jar都只是用於編譯代碼的接口。 jaxws-api.jar可能只包含接口而沒有實現。因此,類加載器將搜索您的類路徑以查找第一個實現,並可能從Codehaus jars中選取它,這可能不是JAX-WS的完整實現。 (但後來可能是這樣,我之所以懷疑是因爲我在他們的網站上看到它是新添加的)。 – raminr

+0

就像我所說的,據我所知,所有的JEE應用服務器都應該爲JAX- WS。如果沒有,請嘗試下載參考實現:https://jax-ws.java.net/ - 您使用哪個應用程序服務器? – raminr