1. 程式人生 > >Servlet版本衝突引起的Error

Servlet版本衝突引起的Error

本地打包部署應用都可以正常啟動和響應請求,但是通過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裡找到它手動排除就可以了