Maven项目更新传递依赖修复Spring-Beans漏洞的方法咨询
- 你提到的第一种手动指定
spring-beans、spring-core版本的方案完全不推荐。Spring Boot官方对parent中管理的所有依赖做过全链路兼容性校验,你把5.2.x线的Spring核心包硬升到5.3.x跨次版本,会导致Spring生态下的其他关联包(spring-context、spring-aop、spring-web等)版本不匹配,现在没报错不代表运行时不会出现类缺失、方法签名不匹配的隐性问题,隐患比原漏洞还大。 - 第二种升级
spring-boot-starter-parent的方案方向是对的,但你选的版本跨度过大,且没有处理依赖冲突,才出现了Mockito相关报错。
你碰到的NoSuchMethodError是典型的依赖版本冲突:Spring Boot 2.3.x线默认绑定的Mockito版本为3.3.x,而2.7.0默认绑定Mockito 4.x版本,org.mockito.Answers.get()方法是Mockito 4.x新增的API,说明你项目中存在显式引入的低版本Mockito依赖,没有跟着Spring Boot的依赖管理升级,导致类路径下加载了旧版本的Mockito类。
1. 同大版本线升级Spring Boot补丁版本(零兼容风险,首选)
你当前使用的2.3.9.RELEASE属于Spring Boot 2.3.x维护线,官方在后续补丁版本中已经修复了CVE-2022-2965(你提到的CVE编号漏了2022前缀),不需要跨版本升到2.7.0。直接将parent版本升级到2.3.12.RELEASE即可,该版本默认绑定的Spring版本为5.2.22.RELEASE,正好覆盖漏洞修复,且所有依赖都经过官方兼容性校验,不会出现额外冲突。
配置如下:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.12.RELEASE</version> </parent>
修改完成后执行mvn dependency:tree | grep spring-beans,确认输出的spring-beans版本为5.2.22.RELEASE即修复完成,不需要额外手动指定任何Spring模块的版本。
2. 若确实需要升级到2.7.x等高版本Spring Boot
升级前先清理测试依赖的版本冲突:
- 删除项目中所有显式写死版本的Mockito、JUnit、spring-test、maven-surefire-plugin依赖,统一交给spring-boot-starter-parent的依赖管理控制版本
- 执行
mvn dependency:tree | grep mockito排查依赖树,确保所有Mockito相关包版本均为4.x以上,没有3.x版本的残留包引入 - 清理完成后再重新构建即可解决Mockito相关报错
3. 临时无法升级Spring Boot版本时的兼容方案
如果因为项目限制暂时不能升级Spring Boot parent版本,不要直接在<dependencies>中单独声明单个Spring模块的版本,应该通过覆盖版本属性的方式,统一升级所有Spring模块到同线安全版本,避免版本不匹配:
<properties> <!-- 统一覆盖所有Spring模块版本,保持5.2.x线兼容性 --> <spring.version>5.2.22.RELEASE</spring.version> </properties>
这种方式会让parent中管理的所有Spring相关包统一升级到5.2.22.RELEASE,不会出现单个包版本不一致的问题。
绝对不要手动跨大版本指定单个Spring核心包的版本,Spring核心模块(spring-core、spring-beans、spring-context、spring-aop等)之间是强耦合的,必须保持版本完全一致,手动指定单个包版本会导致其他关联包版本错位,引发难以排查的运行时异常。
内容的提问来源于stack exchange,提问作者somya gaur

