【问题标题】:Sharing open source (Spring/Spring Security/Hibernate/etc) jars across web applications跨 Web 应用程序共享开源(Spring/Spring Security/Hibernate/etc)jar
【发布时间】:2012-01-03 02:02:14
【问题描述】:

我们有一堆基于上述开源框架的 Java EE 应用程序。每个应用程序的 WEB-INF/lib 都有以下常用 jar:

antlr-2.7.6.jar*
aopalliance-1.0.jar*
asm-3.3.1.jar*
aspectjrt-1.6.8.jar*
aspectjweaver-1.6.8.jar*
cglib-2.2.jar*
commons-beanutils-1.8.3.jar*
commons-collections-3.1.jar*
commons-dbcp-1.4.jar*
commons-digester-2.1.jar*
commons-fileupload-1.1.1.jar*
commons-io-2.0.1.jar*
commons-logging-1.1.1.jar*
commons-pool-1.5.6.jar*
dom4j-1.6.1.jar*
hibernate-jpa-2.0-api-1.0.0.Final.jar*
hibernate-tools.jar*
hibernate-validator-4.1.0.Final.jar*
hibernate3.jar*
jackson-all-1.7.5.jar*
javassist-3.12.0.GA.jar*
javax.inject.jar*
log4j-1.2.16.jar*
org.springframework.aop-3.0.5.RELEASE.jar*
org.springframework.asm-3.0.5.RELEASE.jar*
org.springframework.beans-3.0.5.RELEASE.jar*
org.springframework.context-3.0.5.RELEASE.jar*
org.springframework.context.support-3.0.5.RELEASE.jar*
org.springframework.core-3.0.5.RELEASE.jar*
org.springframework.expression-3.0.5.RELEASE.jar*
org.springframework.jdbc-3.0.5.RELEASE.jar*
org.springframework.orm-3.0.5.RELEASE.jar*
org.springframework.transaction-3.0.5.RELEASE.jar*
org.springframework.web-3.0.5.RELEASE.jar*
org.springframework.web.servlet-3.0.5.RELEASE.jar*
poi-3.7-20101029.jar*
slf4j-api-1.6.1.jar*
slf4j-ext-1.6.1.jar*
slf4j-log4j12-1.6.1.jar*
spring-security-acl-3.0.5.RELEASE.jar*
spring-security-aspects-3.0.5.RELEASE.jar*
spring-security-config-3.0.5.RELEASE.jar*
spring-security-core-3.0.5.RELEASE.jar*
spring-security-taglibs-3.0.5.RELEASE.jar*
spring-security-web-3.0.5.RELEASE.jar*
testng-6.0.1.jar*
tiles-api-2.2.2.jar*
tiles-core-2.2.2.jar*
tiles-jsp-2.2.2.jar*
tiles-servlet-2.2.2.jar*
tiles-template-2.2.2.jar*
validation-api-1.0.0.GA.jar*

我们在部署时遇到 permgen 错误,每场战争只有 20 MB,其中大部分是 3rd 方 jar。

由于所有开源项目的所有应用程序都在同一个版本上,我想知道如果我移动 Spring、Spring Security、Spring Tiles、Hibernate、Hibernate 相关的 3rd 方 jar(cglib、antlr、等),记录和 apache-commons.* 到 TOMCAT/lib 文件夹。

我记得从 Struts 时代(2003 年或 2004 年)开始,每个 web 应用程序都应该拥有自己的 struts jar 副本,并且不鼓励在应用程序服务器级别共享。是否有任何此类劝阻(版本控制除外)?

作为一个辅助问题:是否有一个通用规则可以遵循哪些 3rd 方 jar 可以共享或不能共享(如果文档中没有明确提及?

我将不胜感激。 谢谢。

【问题讨论】:

  • log4j 肯定应该进入每个 WAR,如果您也为每个 WAR 打包 log4g.properties(例如,您为每个 Web 应用程序有单独的日志文件)。否则(如果您有应用服务器范围的log4g.properties),您可以将log4j 放入应用服务器libs/。请注意,如果其中一个框架中存在内存泄漏(例如通过静态变量),它将影响整个应用服务器。
  • 关于内存泄漏的要点。

标签: hibernate spring jakarta-ee tomcat classloader


【解决方案1】:

根据您引导应用程序的方式,您可能会移动大部分(或全部)这些 jar(测试并找出答案)。您需要小心的是依赖于从静态初始化程序引导的框架。如果我没记错的话,Struts 是从读取 struts-config 文件的静态初始化程序配置自己的。由于静态初始化器仅在第一次加载类时运行,因此它在共享类加载器中无法正常工作。

更重要的是,您的问题可能不仅仅只是将 jar 移至共享加载器。 Spring 和 Hibernate 将在运行时为实体和 AOP 代理(用于事务支持等)创建大量动态类,它们将驻留在永久代中。通常,对于 Spring 和 Hibernate 的应用程序,您必须增加 permgen 空间(例如,通过 Oracle HotSpot VM 上的 -XX:MaxPermSize 参数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-15
    • 2020-07-23
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多