2011-12-03 19 views
7

一个为tomcat webapplication打包的war包含WEB-INF/classes和WEB-INF/lib/*。jarWEB-INF/classes/vs WEB-INF/lib/*。jar in classpath priority?

哪个在CLASSPATH中有优先权?

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

+1

类似http://stackoverflow.com/q/5474765/435605 –

回答

11

当处理从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/classes中的WEB-INF/lib目录之前首先搜索

编号:http://tomcat.apache.org/tomcat-5.5-doc/class-loader-howto.html

2

如果您将类放入WEB-INF/classes中,它们在WEB-INF /库。我有时使用它来进行调试。 另请参阅here