2012-11-16 39 views
3

我有一个Web应用程序A.war,它有两个servlet AServletBServlet。两个实例化助手类com.mycompany.Foo.class(这是我自己的类,而不是第三方库)。当两个WAR具有相同的类时,JBoss类加载

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

问题是,由于两个WAR中存在相同的类,并且WAR部署在相同的JBoss实例上,是否会有任何类加载问题?

回答

1

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

但是,既然两个战争将包含相同的类,你有没有考虑过包装这个类在一个jar中,并将其放置在jboss实例lib目录?这样您就不需要将其包含在您实例中部署的所有Web应用程序中。

看看Jboss documentation here

+0

你从哪里得到的,因为它是一个普通的类,它需要在一个罐子里?该类是一个普通类,可以在classes /目录或lib/ .jar的两个应用程序中单独部署。 – randominstanceOfLivingThing

+0

@Suresh Koya:在第二段中,我并不是说它需要放在jar中,正如你所说的,类可以完美地放置在每个应用程序的classes目录中,没关系,当然它也可以工作。但我正在指出一种替代方法:将该类放入JBoss $ JBOSS_HOME/server//lib目录中(在jar中),这样您就不需要在每个需要它的应用程序中复制该类。 – Toni

+0

感谢Toni为答案和指向文档的指针。我还会研究将我的通用类打包到jar中,并将其放入实例lib目录中。 – Pacman

1

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

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

+0

嗨Philippe,统一的类加载适用于除WAR文件之外的所有Jboss类型的部署。在WAR的情况下,默认情况下,Jboss 5.1将直接从它自己的WEB-INF/classes和WEB-INF/libs中加载类。所以你所描述的情况会发生在EAR文件中(即:如果你在各自的EAR/lib目录中有相同库的不同版本,JBoss会加载第一个被部署的,所以其中一个耳朵会使用另一个的版本,而不是它自己的版本),但在WAR中不会有这个问题。 – Toni

+0

我站好了 –

相关问题