[英]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.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
test.ejb.jar
和test.web.war
可以使用test.ear/lib
中的.jar文件的类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.