假设在一个Java EE服务器上部署的Java EE应用程序很少(供应商没有意义,可能是Glassfish,JBoss,WebLogic等)。每个应用程序在部署的.war或.ear中包含相同的库,例如:log4j.jar。 (是的,我知道最好在服务器上的ext-lib目录中安装一个.jar,将其共享给所有应用程序,但在这种情况下,每个人都有自己的log4j.jar副本。)
现在,服务器正在部署所有这些应用程序,运行:
1)一个版本的log4j.jar(可能是第一个部署),共享其他应用程序?
2)每个已部署应用程序的log4j实例数量(消耗RAM的次数与部署的应用程序数量相同)?
哪句话是对的?
答案 0 :(得分:2)
它通常是2)(旧版JBoss曾经做过1),即默认情况下在应用程序之间共享类),但这通常是一件好事,因为这意味着一个web-app中的库访问不会影响另一个。在您的特定示例中,它允许您为每个应用程序设置不同的日志配置。
答案 1 :(得分:0)
据我所知,应用程序容器将为每个应用程序使用不同的类加载器。所以它可能是第二种选择。
答案 2 :(得分:0)
通常,您在应用程序中包含的所有jar只对应用程序可见,因为每个应用程序都有自己的类路径。因此,在多个应用程序中使用相同的库会导致在内存中加载相同库的更多实例
开发人员可以避免这种重复,将库保存在应用程序服务器上的共享文件夹中,而不是将其包含在应用程序存档中。
如果使用maven,可以将依赖库声明为“已提供”,以使其不包含在部署档案中
不幸的是,每个应用程序服务器都有自己的共享jar配置,例如Glassfish希望它们位于domain/lib/ext
文件夹中
这可以通过配置maven和配置文件来管理,一个用于要部署的每个应用程序服务器,并为每个配置文件配置一个插件以将库复制到适当的文件夹中。