2013-03-06 201 views
0

我做了功課,但仍無法找到解決問題的方法。我通過NetBeans創建了一個WAR文件,該文件使用soap和附件 - saaj技術。正如所建議的,我在我的項目中包括:saaj-impl.jar,saaj-ri.jar,saaj-api.jar。然而,當我「熱部署」,或將我的WAR文件到webapps目錄下,我得到以下異常:加載saaj類庫時出現問題

java.lang.NoClassDefFoundError: com/sun/xml/messaging/saaj/soap/MessageFactoryImpl 
source.pkg.SoapClient.sendSoapMessage(SoapClient.java:120) 
source.pkg.Air.<init>(Air.java:233) 
source.flightops.AirController.<init>(AirController.java:15) 
servlets.ResultsDisplay.processRequest(ResultsDisplay.java:40) 
servlets.ResultsDisplay.doGet(ResultsDisplay.java:91) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
root cause 

java.lang.ClassNotFoundException: com.sun.xml.messaging.saaj.soap.MessageFactoryImpl 
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711) 
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556) 
source.pkg.SoapClient.sendSoapMessage(SoapClient.java:120) 
source.pkg.Air.<init>(Air.java:233) 
source.flightops.AirController.<init>(AirController.java:15) 
servlets.ResultsDisplay.processRequest(ResultsDisplay.java:40) 
servlets.ResultsDisplay.doGet(ResultsDisplay.java:91) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:621 

我想明確表示classpath中,像這樣:

System.setProperty("java.class.path", wjp.getDataDir() + "/webapps/" + wjp.getAppContext() + "/WEB-INF/lib"); 

我做更多的研究和試圖調用類加載器:

try 
{   
Class.forName("com.sun.xml.messaging.saaj.soap.MessageFactoryImpl").getClassLoader(); 
} 
catch (ClassNotFoundException ex) 
{ 
     Logger.getLogger(AirDriver.class.getName()).log(Level.SEVERE, null, ex); 
} 

但仍然是上述例外。這很奇怪,因爲當我重新啓動服務器時,有時應用程序工作正常 - 接收到SOAP響應並顯示結果,但在重新啓動服務器後僅顯示。這暗示了saaj類在服務器重啓時以某種方式發現的事實?但是,當我「熱部署」或將更新的WAR放置到webapps目錄而不重新啓動時,問題就是它必須工作。每次更新WAR時,我們都不能重新啓動生產服務器。

另一個奇怪的問題是,我重新啓動服務器後,啓動這個WAR應用程序,它工作正常。但是,其他使用相同saaj類庫的應用程序也會拋出同樣的異常!所以它要麼使用這個WAR應用程序,要麼使用其他應用程序,或者使用其他應用程序,並且此WAR應用程序會拋出此異常。是否有某種有限的Saaj圖書館共享?我從來沒有見過這樣的事情。

請問有人能幫我解決這個非常奇怪的問題嗎?

謝謝, Victor。

回答

0

該問題已通過在主Web容器中重新實現應用程序(即ROOT/WEB-INF)而不是作爲單獨的portlet解決。