当两个WAR具有相同的类时,JBoss类加载

时间:2012-11-16 19:27:15

标签: java-ee jboss classloader jboss5.x

我有一个Web应用程序A.war,它有两个servlet AServletBServlet。两者都实例化一个辅助类com.mycompany.Foo.class(这是我自己的类,而不是第三方库)。

现在我想将两个servlet分成两个单独的WAR:A.war只有AServlet,而一个新的B.war将有BServletAServlet将通过HTTP GET调用BServlet。两个WAR都有com.mycompany.Foo.class。我想在同一个JBoss实例上部署两个WAR。

问题是,是否存在任何类加载问题,因为两个WAR中存在相同的类,并且WAR被部署在同一个JBoss实例上?

2 个答案:

答案 0 :(得分:1)

不,你不应该遇到任何问题。默认情况下,Web应用程序类加载器的工作方式与Java2委托模型不同:当Web应用程序首先需要一个类时,它将查找本地存储库(即wEB-INF / classes或WEB-INF / libs中的类和库)目录)而不是委托。因此,您提出的配置将毫无问题地工作。

但是由于两个战争都包含相同的类,你是否考虑过在jar中打包这个类并将它放在jboss实例的lib目录中?这样,您就不需要将它包含在实例中部署的所有Web应用程序中。

看看Jboss documentation here

答案 1 :(得分:1)

是的,如果两个WAR中的com.mycompany.Foo.class不完全相同,则会出现问题。在JBoss 5.1中,默认情况下,类名是唯一的(统一类加载)。这意味着只能有一个com.mycompany.Foo.class并且它们在两个应用程序之间共享。可以禁用此行为。

查看(JBossClassLoaderHistory)[https://community.jboss.org/wiki/JBossClassLoaderHistory]了解更多信息。