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>
  • 相关阅读:
    C#中 @ 的用法
    ASP.NET页面间传值
    ASP.NET中常用的文件上传下载方法
    把图片转换为字符
    把图片转换为字符
    JavaScript 时间延迟
    Using WSDLs in UCM 11g like you did in 10g
    The Definitive Guide to Stellent Content Server Development
    解决RedHat AS5 RPM安装包依赖问题
    在64位Windows 7上安装Oracle UCM 10gR3
  • 原文地址:https://www.cnblogs.com/ocean234/p/10100921.html
Copyright © 2011-2022 走看看