我有一个Web应用程序A.war,它有两个servlet AServlet
和BServlet
。两者都实例化一个辅助类com.mycompany.Foo.class
(这是我自己的类,而不是第三方库)。
现在我想将两个servlet分成两个单独的WAR:A.war只有AServlet,而一个新的B.war将有BServlet
。 AServlet
将通过HTTP GET调用BServlet
。两个WAR都有com.mycompany.Foo.class
。我想在同一个JBoss实例上部署两个WAR。
问题是,是否存在任何类加载问题,因为两个WAR中存在相同的类,并且WAR被部署在同一个JBoss实例上?
答案 0 :(得分:1)
不,你不应该遇到任何问题。默认情况下,Web应用程序类加载器的工作方式与Java2委托模型不同:当Web应用程序首先需要一个类时,它将查找本地存储库(即wEB-INF / classes或WEB-INF / libs中的类和库)目录)而不是委托。因此,您提出的配置将毫无问题地工作。
但是由于两个战争都包含相同的类,你是否考虑过在jar中打包这个类并将它放在jboss实例的lib目录中?这样,您就不需要将它包含在实例中部署的所有Web应用程序中。
答案 1 :(得分:1)
是的,如果两个WAR中的com.mycompany.Foo.class
不完全相同,则会出现问题。在JBoss 5.1中,默认情况下,类名是唯一的(统一类加载)。这意味着只能有一个com.mycompany.Foo.class
并且它们在两个应用程序之间共享。可以禁用此行为。
查看(JBossClassLoaderHistory)[https://community.jboss.org/wiki/JBossClassLoaderHistory]了解更多信息。