求助:java.lang.NoSuchMethodError未解决,疑Jar包冲突
首先,这个错误的核心原因很明确:HttpServletResponse.getStatus()方法是从Servlet 2.5规范开始才加入的,如果你的应用运行时加载的是Servlet 2.4或更早版本的API Jar包,就会触发这个NoSuchMethodError。你已经尝试更新servlet-api但Maven环境下没解决,大概率是依赖传递引入了旧版本的Servlet API,或者容器本身的API版本不匹配导致的。下面给你一步步排查和解决的方案:
排查Maven依赖树中的冲突
Maven的依赖传递很容易引入你没显式声明的旧版本Jar包。你可以通过以下命令生成完整的依赖树:mvn dependency:tree在输出结果中搜索
javax.servlet:servlet-api,看看是否有版本低于2.5的条目,或者有没有其他容器相关的依赖(比如tomcat-servlet-api、jboss-servlet-api等)意外引入了旧版本。排除冲突的旧版本依赖
如果找到某个依赖引入了旧的servlet-api,你需要在Pom.xml中给该依赖添加排除规则,阻止它传递引入旧Jar:<dependency> <groupId>你的依赖GroupId</groupId> <artifactId>你的依赖ArtifactId</artifactId> <version>你的依赖版本</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </exclusion> </exclusions> </dependency>确认servlet-api的依赖范围为
provided
容器(比如Tomcat、Jetty)本身会自带Servlet API Jar包,如果你在Maven中将servlet-api的scope设为compile,打包时会把它打进War包,导致和容器自带的API冲突。正确的做法是设置为provided:<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <!-- 或更高版本,比如3.0.1,根据你的容器支持情况选择 --> <scope>provided</scope> </dependency>检查容器的Servlet版本支持
即使你在Maven中声明了正确的servlet-api版本,如果运行应用的容器不支持对应版本,还是会用容器自带的旧API:- Tomcat 5.5 → 仅支持Servlet 2.4
- Tomcat 6.x → 支持Servlet 2.5
- Tomcat 7.x → 支持Servlet 3.0
- Tomcat 8.x → 支持Servlet 3.1
- Tomcat 9.x → 支持Servlet 4.0
如果你的容器版本过低,需要升级容器到支持你所用Servlet API版本的版本。
检查关联API的版本匹配
还要注意和Servlet API关联的其他依赖(比如jsp-api、el-api),它们的版本需要和Servlet API版本匹配,否则也可能间接导致冲突。比如Servlet 2.5对应的jsp-api版本是2.1,el-api是1.0。
内容的提问来源于stack exchange,提问作者Noorus Khan

