宿題をしましたが、まだ問題の解決策を見つけることができません。添付ファイル付きの石鹸 (saaj テクノロジ) を使用する NetBeans を介して WAR ファイルを作成しました。提案どおり、プロジェクトに 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 が更新されるたびに本番サーバーを再起動する余裕はありません。
もう1つの奇妙な問題は、サーバーを再起動した後、このWARアプリを起動すると正常に動作することです。ただし、同じ saaj クラス ライブラリを使用する他のアプリは、この同じ例外をスローします。したがって、このWARアプリを使用していて他のアプリが機能していないか、他のアプリを使用していて、このWARアプリがこの例外をスローしています。ある種の限定的な saaj ライブラリ共有はありますか? 私はこれまでにこのようなものを見たことがありません。
この非常に奇妙な(そして厄介な)問題について誰か助けてくれませんか?
ありがとう、ビクター。