如何确定Tomcat运行时使用的servlet-api.jar版本及类加载覆盖情况
Tomcat类加载优先级与版本确认方法
一、Common类加载器不会覆盖WEB-INF/lib中的jar
根据Tomcat的类加载规则,Web应用类加载器(负责加载/WEB-INF/classes和/WEB-INF/lib下的资源)会优先于Common类加载器加载类。你看到的加载顺序已明确:
Bootstrap classes of your JVM
/WEB-INF/classes of your web application
/WEB-INF/lib/*.jar of your web application
System class loader classes
Common class loader classes
这意味着,当Tomcat需要加载javax.servlet.Servlet这类Servlet API相关类时,会先从你的应用/WEB-INF/lib下的servlet-api 3.1.0.jar中查找,找到后直接使用该版本,不会再去Common类加载器管理的tomcat/lib目录下查找对应类。Common类加载器的资源只有在Web应用类加载器找不到对应类时才会被加载。
二、如何确认运行时实际使用的jar版本
有两种实用方法可以验证:
- 打印类加载路径:在你的Servlet或业务类中加入以下代码,运行后查看输出即可定位实际使用的jar:
ClassLoader classLoader = javax.servlet.Servlet.class.getClassLoader(); URL resource = classLoader.getResource("javax/servlet/Servlet.class"); System.out.println(resource);
输出结果类似jar:file:/path/to/your/webapp/WEB-INF/lib/servlet-api-3.1.0.jar!/javax/servlet/Servlet.class,直接显示类所在的jar路径和版本。
- 开启类加载调试日志:在Tomcat的
conf/logging.properties中添加配置:
org.apache.catalina.loader.WebappClassLoader.level = FINE
启动Tomcat后,日志会详细记录每个类的加载来源,从中可找到Servlet API类的加载路径。
内容的提问来源于stack exchange,提问作者vrreddy1234
相关产品推荐
相关产品推荐

