【问题标题】:How does Java EE app server manage libs?Java EE 应用服务器如何管理库?
【发布时间】:2013-01-17 13:51:24
【问题描述】:

假设在一台 Java EE 服务器上部署的 Java EE 应用程序很少(供应商无意义,可能是 Glassfish、JBoss、WebLogic 等)。每个应用程序在部署的 .war 或 .ear 中包含相同的库,例如:log4j.jar。 (是的,我知道最好在服务器的 ext-lib 目录中安装一个 .jar,将其共享给所有应用程序,但在这种情况下,每个人都有自己的 log4j.jar 副本)。

现在,服务器正在部署所有这些应用程序,正在运行:

1) log4j.jar 的一个版本(可能作为第一个部署),共享给其他应用程序?

2) 每个已部署应用程序的 log4j 实例数(消耗 RAM 的次数是已部署应用程序数的数倍)?

哪个句子是正确的?

【问题讨论】:

    标签: jakarta-ee classloader


    【解决方案1】:

    通常是 2)(旧版本的 JBoss 曾经这样做 1),即默认情况下在应用程序之间共享类),但这通常是一件好事,因为这意味着一个 Web 应用程序中的库访问不能影响另一个。在您的具体示例中,它允许您为每个应用程序设置不同的日志配置。

    【讨论】:

      【解决方案2】:

      据我所知,应用程序容器将为每个应用程序使用不同的类加载器。所以这可能是第二种选择。

      【讨论】:

        【解决方案3】:

        通常,您包含在应用程序中的所有 jar 仅对该应用程序可见,因为每个应用程序都有自己的类路径。因此,在多个应用程序中使用同一个库会导致内存中加载同一个库的更多实例。
        开发人员可以避免这种重复,将库保存在应用程序服务器上的共享文件夹中,而不是将其包含在应用程序存档中。
        如果使用 maven,可以将依赖库声明为“已提供”,以使其不包含在部署存档中。
        不幸的是,每个应用程序服务器都有自己的共享 jar 配置,例如 Glassfish 希望它们位于 domain/lib/ext 文件夹中。
        这可以通过使用配置文件配置 maven 来管理,每个应用程序服务器配置一个配置文件,并为每个配置文件配置一个插件以将库复制到适当的文件夹中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-27
          • 2012-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多