【问题标题】:JBoss classloading when 2 WARs have the same class2 个 WAR 具有相同类时的 JBoss 类加载
【发布时间】:2012-11-16 19:27:14
【问题描述】:

我有一个 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 实例上,是否会出现任何类加载问题?

【问题讨论】:

    标签: jakarta-ee jboss classloader jboss5.x


    【解决方案1】:

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

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

    看看Jboss documentation here

    【讨论】:

    • 你从哪里得到的,因为它是一个普通的类,它需要放在一个罐子里?该类为通用类,可以分别部署在classes/目录或lib/中的两个应用中.jar.
    • @Suresh Koya:在第二段中我并不是说它需要放在一个罐子里,正如你所说的,这个类可以完美地放在每个应用程序的类目录中,没关系,当然它会起作用。但我指的是另一种选择:将类放在 JBoss $JBOSS_HOME/server//lib 目录中(在一个 jar 中),这样您就不需要在每个需要它的应用程序中复制该类。跨度>
    • 感谢 Toni 的回答和指向文档的指针。我还将研究将我的常用类打包到一个 jar 中并将其放置在实例 lib 目录中。
    【解决方案2】:

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

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

    【讨论】:

    • 嗨 Philippe,统一类加载适用于所有 Jboss 类型的部署,WAR 文件除外。对于 WAR,默认情况下 Jboss 5.1 将直接从它自己的 WEB-INF/classes 和 WEB-INF/libs 加载类。因此,您所描述的情况将发生在 EAR 文件中(即:如果您在其各自的 EAR/lib 目录中有同一库的不同版本,JBoss 将只加载要部署的第一个,因此其中一个耳朵将使用其他版本,而不是自己的版本),但在 WAR 版本中不会出现此问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多