2013-03-06 4 views
0

Я сделал свою домашнюю работу, но все еще не смог найти решение моей проблемы. Я создал файл WAR через NetBeans, который использует мыло с вложениями - технология 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 

Я попытался явно указать путь к классу так:

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

Проблема решена путем повторной реализации приложения в основном веб-контейнере, то есть ROOT/WEB-INF, в отличие от отдельного портлета.