为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,那么编织方面将不会生效
答案 0 :(得分:14)
当处理从Web应用程序的WebappX类加载器加载类的请求时,此类加载器将首先查看本地存储库,而不是在查找之前委派。也有例外。作为JRE基类的一部分的类不能被覆盖。对于某些类(例如J2SE 1.4+中的XML解析器组件),可以使用J2SE 1.4认可的功能(请参阅上面的常见类加载器定义)。最后,类加载器将忽略任何包含servlet API类的JAR。 Tomcat 5中的所有其他类加载器都遵循通常的委托模式。
因此,从Web应用程序的角度来看,类或资源加载按以下顺序查找以下存储库:
Bootstrap classes of your JVM
System class loader classes (described above)
/WEB-INF/classes of your web application
/WEB-INF/lib/*.jar of your web application
$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参考:http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html
答案 1 :(得分:2)
如果将类放入WEB-INF / classes,它们在WEB-INF / lib中的jar之前具有优先级。我有时会将其用于调试目的。 另请参阅here。