私は奇妙な種類の問題を抱えています。
私のアプリケーションは次のような単純な構造になっています: Web モジュール (WAR) を含む EAR。
特定のアプリケーション jar を EAR の lib ディレクトリに配置し、それを WAR モジュールの MANIFEST に参照します。
WAR の lib ディレクトリに別の jar があります。この jar にはサーブレットが含まれています。
サーバーを起動してアプリケーションを完全に公開すると、すべて問題ありませんが、ランタイム段階でアプリケーションのエントリ ポイントを呼び出すと、このサーブレットに関する ClassNotFound エラーが発生します。(おそらく、サーブレットは、EAR lib に含まれるアプリケーション jar に含まれるクラスを使用します)
代わりに、特定のアプリケーション jar を他の jar (サーブレットを含むもの) と一緒に WAR の lib ディレクトリに配置すると、(実行時であっても) いかなる種類のエラーも発生しません。
しかし、アプリケーション jar を EAR の lib ディレクトリに保持する必要があります。
他のタイプの jar には問題はありませんが、この場合の問題はサーブレットに関連しているのでしょうか? クラスローディングの分離?わからない?:(
助言がありますか?私に何ができる?
jboss-classloading.xml について複数のタイプの設定を試みましたが成功しませんでした..
PS: websphere のような別のタイプのアプリケーション サーバーでは問題はなく、jar を EAR lib ディレクトリに保持できます。
仮定: 各クラスは、独自のクラスローダーを使用して他のクラスをロードします。したがって、ClassA.class が ClassB.class を参照する場合、ClassB は ClassA のクラスローダーのクラスパス上にあるか、またはその親である必要があります。
(WAR の) マニフェストに jar に関するクラスパスの依存関係を EAR/lib に追加すると、war へのクラスが EAR/lib へのクラスを認識しない可能性はありますか?
私は夢中になっています...別のタイプの設定がありませんか?セキュリティ設定はありますか?
スタックトレース:
{java.lang.NoClassDefFoundError: it/myapp/services/servlets/Dispatcher}|
at it.myapp.services.contexts.ContextManager.configureSet(ContextManager.java:2972)}
at it.myapp.services.servlets.Dispatcher.getSession(Dispatcher.java:1344)}
at it.myapp.services.servlets.Dispatcher.service(Dispatcher.java:5139)}
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)}
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295)}
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)}
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)}
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149)}
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169)}
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145)}
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97)}
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102)}
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336)}
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)}
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653)}
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920)}
at java.lang.Thread.run(Thread.java:722)}
Caused by: java.lang.ClassNotFoundException: it.myapp.services.servlets.Dispatcher from [Module "deployment.MyEAR.ear:main" from Service Module Loader]}
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:196)}
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:444)}
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:432)}
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:374)}
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:119)}
... 17 more}
問題はクラスローディングの可視性に関連しているようです...それは非常に奇妙です。:(
Dispatcher は、WAR/lib の jar にパックされたサーブレット クラスです。このクラスは、EAR/lib の jar に含まれる別のクラス (ContextManager) を呼び出します。WAR/lib のマニフェストで、クラスパスに jar を EAR/lib に正しく追加しました。申し訳ありません...問題は逆かもしれません。つまり、EAR の jar からのクラスは、サーブレット クラスを WAR に認識できないようです...この制限を取り除くことは可能ですか? 私はすべての瓶を戦争に投入したくありません...
前もって感謝します。
ピストレロ。