1

私は奇妙な種類の問題を抱えています。

私のアプリケーションは次のような単純な構造になっています: 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 に認識できないようです...この制限を取り除くことは可能ですか? 私はすべての瓶を戦争に投入したくありません...

前もって感謝します。

ピストレロ。

4

1 に答える 1

0

私たちのプロジェクトでは、次のような構造になっています ( test.ear2 つのモジュールtest.ejb.jarとが含まれていますtest.web.war)。

test.ear
 +-- lib (contains 3rd party libs)
 +-- META-INF
 |    +-- application.xml (lists modules test.web.war and test.ejb.jar)
 |    +-- MANIFEST.MF
 +-- test.ejb.jar
 |    +-- META-INF
 |    |    +- ejb-jar.xml
 |    +-- com (root package of all ejb .class files)
 |         +-- ...
 +-- test.web.war
      +-- META-INF
      |    +-- MANIFEST.MF (Class-Path: test.ejb.jar)
      +-- WEB-INF
      |    +-- classes
      |    |    +-- com (root package of all war .class files)
      |    |         +-- ...
      |    +-- lib (3rd party libs only used by .war)
      |    +-- web.xml
      +-- index.html

内部の .jar ファイルのクラスは、およびtest.ear/libで使用できます。test.ejb.jartest.web.war

于 2013-09-26T08:02:26.627 に答える