2013-09-26 45 views
1

我有一個奇怪的問題。EAP 6.1中的類加載問題 - JBoss 7.2/WAR類沒有看到EAR類

我的應用程序是簡單的結構就像:包含Web模塊(WAR)一隻耳朵。

我把我的具體應用的jar到EAR的lib目錄下,然後我指成WAR模塊的清單。

我在WAR的lib目錄另一個JAR,這瓶含有一個servlet。

當我啓動服務器,並充分發表我的應用程序一切都很好,但在運行時階段,當我把我的應用程序的入口點我獲得關於這個servlet一個ClassNotFound的錯誤。 (也許servlet使用包含在我的應用程序jar中的類,它包含在EAR lib中)

相反,如果我將特定的應用程序jar放入WAR目錄的lib目錄中,該servlet)我不會獲得任何類型的錯誤(即使在運行時)。

但我需要將我的應用程序jar保存到EAR的lib目錄中。

我沒有與其他類型的問題罐子,也許在這種情況下,問題涉及到servlet? ?類加載隔離不知道:(

任何建議,我能做些什麼

我嘗試多種類型有關,而不成功的jboss-classloading.xml配置..

PS:???與其他類似websphere的應用程序服務器我沒有任何問題,我可以將jar保存到EAR lib目錄中。

假設:每個類將使用它自己的類加載器來加載其他類,因此如果ClassA.class引用ClassB .class,那麼ClassB需要位於ClassA的類加載器的類路徑中,或者它是父類。

如果我添加到體現(WAR)的有關罐子到EAR/lib中的類路徑依賴是如何可能的是,全班分成戰爭好好嘗試一下看到全班分成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中的servlet類,這個類調用另一個包含在EAR/lib的jar中的類(ContextManager) 在WAR/lib的清單中,我有正確地添加到classpath jar到EAR/lib中 對不起......也許問題是相反的,也就是說從EAR的jar中的一個類看起來不能將servlet類看成WAR ......是否可以去除這個限制?想要把所有的罐子到戰爭......

在此先感謝。

IlPistolero。

回答

0

在我們的項目,我們有這樣的結構(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.ear/lib的的.jar文件的類可以通過test.ejb.jartest.web.war使用。

+0

感謝您的迴應,但我已經知道像這樣的結構應該是正確的。無論我們有像你一樣的結構,但是我們有問題。 – Caccia87

+0

對不起......也許問題是相反的,也就是說從EAR的jar中的一個類看起來不能將servlet類看成WAR ...可能會刪除這個限制嗎?我不想把所有的jar放到戰爭中...... – Caccia87

+0

我不確定這是否可能,但是我認爲不管怎麼樣都有從庫到應用程序代碼的依賴關係是不好的做法。也許你可以將庫分成網絡和非網絡(=庫)。 – isnot2bad