0

我做了功课,但仍然无法找到解决问题的方法。我通过 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 库共享?我以前从未见过这样的事情。

拜托,有人可以帮我解决这个非常奇怪(和讨厌)的问题吗?

谢谢你,维克多。

4

1 回答 1

0

该问题已通过在主 Web 容器(即 ROOT/WEB-INF)中重新实现应用程序而不是作为单独的 portlet 来解决。

于 2013-03-10T17:59:42.177 回答