Spring MVC项目遇Java.lang.NoSuchMethodError及servlet-api依赖缺失求助
解决Spring MVC项目中Java.lang.NoSuchMethodError及servlet-api未打包问题
问题根源
你的servlet-api依赖设置了<scope>provided</scope>,这个Maven scope的含义是:该依赖由运行Web应用的容器(比如Tomcat)提供,Maven打包时不会把它复制到WEB-INF/lib目录中。如果运行容器没有提供对应版本的servlet-api,或者容器提供的版本和你依赖的4.0.0不匹配,就会触发NoSuchMethodError。
解决方案
针对不同场景,有以下几种处理方式:
本地开发调试场景:
如果你用内嵌容器或者本地Tomcat调试,直接把servlet-api的scope改成compile,这样Maven打包时会将它包含到WEB-INF/lib中:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.0</version> <!-- 去掉provided,改为compile(默认就是compile,也可以不写) --> <scope>compile</scope> </dependency>注意:生产环境部署时,记得改回
provided,避免和容器自带的servlet-api冲突。容器版本匹配场景:
确认你的运行容器支持Servlet 4.0规范,比如Tomcat 9.x对应Servlet 4.0。如果你的容器是Tomcat 8.x(对应Servlet 3.1),需要把servlet-api版本降到3.1.0,同时保持providedscope:<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>Maven插件运行场景:
如果你用tomcat-maven-plugin启动项目,需要在插件配置中指定和依赖匹配的Servlet版本,确保环境一致:<build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat9-maven-plugin</artifactId> <version>2.2</version> <configuration> <path>/springmvc01-base</path> </configuration> </plugin> </plugins> </build>
内容的提问来源于stack exchange,提问作者平芜尽处外
相关产品推荐
相关产品推荐

