You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动