1

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

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

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

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

哪句话是正确的?

4

3 回答 3

2

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

于 2013-01-17T14:05:18.637 回答
0

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

于 2013-01-17T13:59:43.260 回答
0

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

于 2013-01-17T16:16:35.413 回答