Servlet版本衝突引起的Error
阿新 • • 發佈:2018-12-11
本地打包部署應用都可以正常啟動和響應請求,但是通過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)直接排除就可以了(不過這貨有時候不怎麼靠譜,搜不到多餘的依賴...)
2、通過maven的命令列:mvn dependency:tree 來檢視Maven依賴資訊是最準確的
可以看到servlet-api-2.4.jar是通過jsp-api這個jar引入進來的,我們在pom.xml裡找到它手動排除就可以了