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