繁体   English   中英

EAP 6.1中的类加载问题-JBoss 7.2 / WAR类看不到EAR类

[英]Classloading issue in EAP 6.1 - JBoss 7.2 / WAR Classes don't see EAR classes

我有一个奇怪的问题。

我的应用程序结构很简单:包含Web模块(WAR)的EAR。

我将特定的应用程序jar放入EAR的lib目录中,然后将其引用到WAR模块的MANIFEST中。

我在WAR的lib目录中还有另一个jar,此jar包含一个servlet。

当我启动服务器并完全发布我的应用程序时,一切都很好,但是在运行时阶段,当我调用应用程序的入口点时,我收到有关此Servlet的ClassNotFound错误。 (也许servlet使用了我的应用程序jar中包含的类,而该类包含在EAR lib中)

相反,如果我将特定的应用程序jar与另一个jar(其中一个包含servlet)一起放入WAR togheter的lib目录中,则不会获得任何类型的错误(即使在运行时)。

但是我需要将我的应用程序jar维护到EAR的lib目录中。

我没有其他类型的jar的问题,也许这种情况下的问题与servlet有关? 类加载隔离?不知道吗?

有什么建议么? 我能做什么?

我尝试关于jboss-classloading.xml的多种配置,但没有成功。

PS:使用其他类型的应用程序服务器(例如Websphere),我没有任何问题,并且可以将jar维护到EAR lib目录中。

假设:每个类都将使用其自己的类加载器来加载其他类。 因此,如果ClassA.class引用ClassB.class,则ClassB必须位于ClassA的类加载器的类路径中,或者是其父级。

如果我向(WAR)清单添加有关jar的classpath依赖关系到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中的servlet类,该类调用包含在EAR / lib中的jar中的另一个类(ContextManager)。 在WAR / lib的清单中,我已将jar正确地添加到EAR / lib中,以添加到类路径中。 抱歉...也许问题正好相反,即EAR的jar中的类似乎看不到Servlet类进入WAR ...是否可以消除此限制? 我不想把所有的罐子投入战争...

提前致谢。

IlPistolero。

在我们的项目中,我们有一个像这样的结构( test.ear包含两个模块test.ejb.jartest.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

test.ejb.jartest.web.war可以使用test.ear/lib中的.jar文件的类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM