Maven Web项目启动报错:servlet [mvc-spring]分配异常
解决Spring MVC Maven项目中的
NoSuchMethodError: AbstractApplicationContext.clearResourceCaches()错误 我帮你梳理下这个问题:你遇到的这个报错是典型的Spring框架版本冲突导致的,结合你说「不用Maven依赖时项目正常,用Maven就报错」的情况,问题根源肯定出在Maven的依赖管理上——你的项目里大概率混了不同版本的Spring模块,或者有旧版本的Spring jar包被间接依赖偷偷引入了。
为什么会报这个错?clearResourceCaches()方法是Spring 4.2及以上版本才新增到AbstractApplicationContext类里的,如果运行时加载了低版本的Spring核心包,就会找不到这个方法,直接抛出错误。
具体解决步骤
1. 统一所有Spring依赖的版本
在你的pom.xml里,先定义一个统一的Spring版本属性,然后所有Spring相关的依赖都引用这个版本,彻底避免版本不一致:
<properties> <!-- 选一个稳定的Spring 5.x版本,比如5.3.x系列,兼容性更好 --> <spring.version>5.3.20</spring.version> </properties> <dependencies> <!-- Spring核心模块 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring上下文模块 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- Spring WebMVC模块 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!-- 如果你还有其他Spring相关依赖,比如spring-web,也要用同一个版本 --> </dependencies>
2. 排查并排除冲突的依赖
有时候第三方依赖会间接引入低版本的Spring包,这时候你需要用Maven命令查看依赖树,找出这些冲突的依赖:
mvn dependency:tree
在输出结果里搜索org.springframework,如果发现有不是你指定版本的依赖,就在对应的第三方依赖里添加排除规则,比如:
<!-- 假设某个第三方依赖引入了旧版本Spring --> <dependency> <groupId>com.example.thirdparty</groupId> <artifactId>some-library</artifactId> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> </exclusions> </dependency>
3. 清理并重新构建项目
完成依赖调整后,一定要清理旧的构建文件和依赖,重新构建:
- 执行Maven清理:
mvn clean - 重新下载依赖并打包:
mvn install - 重启你的Tomcat服务器,确保旧的jar包已经被替换成统一版本的新jar包。
关于你的控制器代码
顺便说一句,你的HelloWorldController代码本身没有问题,@Controller、@RequestMapping和@ResponseBody的使用都是正确的,只要版本冲突解决,访问/hello路径就能正常返回"Hello World"。
内容的提问来源于stack exchange,提问作者user6757118




