zoukankan      html  css  js  c++  java
  • 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里找到它手动排除就可以了

      <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>
  • 相关阅读:
    【Java编程思想】13.字符串
    【Java编程思想】12.通过异常处理错误
    【Java编程思想】10.内部类
    【Java编程思想】11.持有对象
    【Java编程思想】9.接口
    【Java编程思想】8.多态
    【Java编程思想】7.复用类
    【Java编程思想】6.访问权限控制
    【Java编程思想】4.控制执行流程
    Ribbon、Feign、Hystrix使用时的超时时间设置问题
  • 原文地址:https://www.cnblogs.com/ocean234/p/10100921.html
Copyright © 2011-2022 走看看