WEB-INF/classes/ vs WEB-INF/lib/*.jar的类路径优先级



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

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

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

Tomcat在类装入器上有几个文档:

  • 高级:加载器组件 (https://tomcat.apache.org/tomcat-5.5-doc/config/loader.html)
  • details: Class Loader HOW-TO (https://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html)

引自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应用程序的/WEB-INF/classes
  • web应用程序的/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/lib之前先搜索WEB-INF/classes

如果您将类放入WEB-INF/classes中,它们在WEB-INF/lib中的jar文件之前具有优先级。我有时将其用于调试目的。

相关内容

最新更新