【问题标题】:WEB-INF/classes/ vs WEB-INF/lib/*.jar in classpath priority?WEB-INF/classes/ vs WEB-INF/lib/*.jar 在类路径优先级中?
【发布时间】:2012-01-11 23:19:25
【问题描述】:

为tomcat webapp打包的war包含WEB-INF/classes和WEB-INF/lib/*.jar

它们中的哪一个在 CLASSPATH 中具有更高的优先级?

我问的原因是,我的应用程序使用 A.jar,其中包含从 aspectj 项目生成的方面;和 B.jar,它们将与 A.jar 的方面进行编织。 当项目 myapp 被编译时,它会生成许多从 B.jar 覆盖相同类的类,这些类被打包到 WEB-INF/classes 目录中。所以如果tomcat先加载WEB-INF/lib/*.jar,那么编织的方面不会生效

【问题讨论】:

标签: tomcat aspectj


【解决方案1】:

Tomcat 在类加载器上有几个文档:

引用http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html:
(为便于阅读添加了换行符)

如上所述,Web 应用程序类加载器不同于默认的 Java 2 委托模型(根据 Servlet 规范,版本 2.3,第 9.7.2 节 Web 应用程序类加载器中的建议)。

当处理从 Web 应用程序的 WebappX 类加载器加载类的请求时,该类加载器将首先在本地存储库中查找,而不是在查找之前进行委托。
也有例外。作为 JRE 基类的一部分的类不能被覆盖。对于某些类(例如 J2SE 1.4+ 中的 XML 解析器组件),可以使用 J2SE 1.4 认可的特性(参见上面的通用类加载器定义)。

最后,任何包含 servlet API 类的 JAR 都会被类加载器忽略。

Tomcat 5 中的所有其他类加载器都遵循通常的委托模式。

因此,从 Web 应用程序的角度来看,类或资源加载按以下顺序查看以下存储库:

  • JVM 的引导类
  • 系统类加载器类(如上所述)
  • /WEB-INF/classes 您的网络应用程序
  • /WEB-INF/lib/*.jar 您的网络应用程序
  • $CATALINA_HOME/common/classes
  • $CATALINA_HOME/common/endorsed/*.jar
  • $CATALINA_HOME/common/i18n/*.jar
  • $CATALINA_HOME/common/lib/*.jar
  • $CATALINA_BASE/shared/classes
  • $CATALINA_BASE/shared/lib/*.jar

所以WEB-INF/classesWEB-INF/lib 之前首先被搜索。

【讨论】:

    【解决方案2】:

    如果你把类放到 WEB-INF/classes 中,它们优先于 WEB-INF/lib 中的 jars。我有时将其用于调试目的。 另见here

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 2018-06-28
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2014-05-19
      相关资源
      最近更新 更多