我做了功课,但仍然无法找到解决问题的方法。我通过 NetBeans 创建了一个 WAR 文件,它使用带有附件的肥皂 - saaj 技术。按照建议,我在我的项目中包括:saaj-impl.jar、saaj-ri.jar、saaj-api.jar。但是,当我“热部署”或将 WAR 文件放入 webapps 目录时,会出现以下异常:
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 库共享?我以前从未见过这样的事情。
拜托,有人可以帮我解决这个非常奇怪(和讨厌)的问题吗?
谢谢你,维克多。