Tomcat运行Servlet时如何选择应用servlet.jar与内置servlet-api.jar
Tomcat 加载Servlet相关Jar包的规则
Tomcat 8.5 采用了打破默认双亲委派模型的Web应用类加载机制,针对你场景中的两个Servlet相关Jar包,加载逻辑分两类情况:
- 对于
javax.servlet.*等规范定义的核心Servlet API类
Tomcat的Web应用类加载器会对这部分包做特殊保护,禁止Web应用自行加载,直接委托给负责加载全局公共资源的Common类加载器处理,也就是只会加载%TOMCAT_HOME%\lib\servlet-api.jar里的对应类,不会使用你WEB-INF/lib下servlet.jar中的Servlet API类。该设计是为了避免Web应用自带的Servlet API版本和服务器实现版本不兼容,引发类转换异常、方法不存在等运行时错误。 - 对于servlet.jar中包含的非
javax.servlet.*开头的自定义类/扩展类
这部分不受保护规则限制,Web应用类加载器会优先从当前应用的WEB-INF\classes和WEB-INF\lib下加载资源,所以会优先使用servlet.jar里的这部分类,找不到对应类才会去全局的%TOMCAT_HOME%\lib下查找。
当前你的应用运行正常,是因为核心Servlet API用的是Tomcat自带的兼容版本,你自行引入的servlet.jar中没有冲突的扩展类,所以没有触发运行时错误。但常规部署场景下不建议在WEB-INF/lib下放置Servlet API相关的Jar包,避免后续版本迭代出现不必要的类冲突。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

