class的搜寻顺序如下 ————- /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 ————– 因此放在不同webapp里的class文件,会被classloader加载成不同的实例。 在不同的webapp加载相同类名的类互不影响。
例如 使用javamail常见的一个出错信息: javax.mail.NoSuchProviderException: No provider for smtp 其真实原因就很可能如下: 在不同的加载jar的目录下放置了不同版本的mail.jar,比如一个是javamail1.3.1的mail.jar 在D:\jakarta-tomcat-5.5.8\common\lib下,而另外一个是javamail1.3.2的mail.jar在 D:\jakarta-tomcat-5.5.8\webapps\mialtest\WEB-INF/lib下, 那么mialtest中使用到javamail进行邮件发送的时候,便会出现No provider for smtp的错误。 Offending class: javax/servlet/Servlet.class (摘自:http://nhr407.iteye.com/blog/733696)
新从svn上检出了一个项目,配置好tomcat,启动时发现这样一条错误 validateJarFile(E:\workspace\gzmetro\webapp\WEB-INF\lib\jsp-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/jsp/JspPage.class validateJarFile(E:\workspace\gzmetro\webapp\WEB-INF\lib\servlet-api-2.4.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class validateJarFile(E:\workspace\gzmetro\webapp\WEB-INF\lib\servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class