Servlet版本冲突引起的Error

时间:2022-01-08 15:42:05

本地打包部署应用都可以正常启动和响应请求,但是通过CI打包部署到服务器有请求进来时就会报错:

java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.getServletContext()Ljavax/servlet/ServletContext;
-- 自定义的拦截器里调用了httpServletRequest.getServletContext();
at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:134) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:958) ~[spring-webmvc-4.3.8.RELEASE.jar:4.3.8.RELEASE]
... 14 more

按照网友们的说法是Servlet版本不够,然而我反复确认过pom.xml里肯定是引用的高版本

    <dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>

后面经过一番排查,发现打包后的部署包中有两个servlet-api:

javax.servlet-api-3.1.0.jar servlet-api-2.4.jar

既然看到两个这货,就不难理解前面的问题了(可能通过CI编译打包时用的是servlet-api-2.4.jar,这个是低版本没有getServletContext()方法),那么着手排除一个

1、idea用户可以直接下载个maven插件(Dependency Analyzer)直接搜索,然后右键排除就可以了(不过这货有时候不怎么靠谱,会有搜不到依赖的情况...)

Servlet版本冲突引起的Error

2、通过maven的命令行:mvn dependency:tree 来查看Maven依赖信息是最准确的

Servlet版本冲突引起的Error

可以看到servlet-api-2.4.jar是通过jsp-api这个jar引入进来的,我们在pom.xml里找到它手动排除就可以了

  <dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<exclusions>
<exclusion>
<artifactId>servlet-api</artifactId>
<groupId>javax.servlet</groupId>
</exclusion>
</exclusions>
</dependency>