Maven更新spring-context后,传递依赖spring-expression版本未更新怎么办?
问题描述
项目中最初的依赖声明:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <scope>provided</scope> </dependency>
对应的dependency:tree输出:
[INFO] +- org.springframework:spring-context:jar:5.3.7:provided [INFO] | +- org.springframework:spring-aop:jar:5.3.7:provided [INFO] | \- org.springframework:spring-expression:jar:5.3.7:provided
因Snyk扫描发现spring-expression存在漏洞,将spring-context版本更新为5.3.27,更新后的依赖声明:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.27</version> <scope>provided</scope> </dependency>
但dependency:tree显示子依赖版本未更新:
[INFO] +- org.springframework:spring-context:jar:5.3.27:provided [INFO] | +- org.springframework:spring-aop:jar:5.3.7:provided [INFO] | \- org.springframework:spring-expression:jar:5.3.7:provided
解决方法
方法1:用Spring BOM统一版本管理
Spring提供物料清单(BOM)来统一所有Spring模块的版本,彻底避免版本不一致问题。在pom.xml的dependencyManagement节点中引入BOM:
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>5.3.27</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
之后你的spring-context依赖可以不用写版本(也可保留),所有Spring相关模块都会自动使用BOM指定的5.3.27版本。
方法2:显式声明子依赖
直接在dependencies节点中添加spring-aop和spring-expression的依赖,指定5.3.27版本:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.27</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.3.27</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.3.27</version> <scope>provided</scope> </dependency>
显式声明的依赖优先级高于传递依赖,会直接覆盖旧版本。
方法3:排查并排除旧版本依赖
执行mvn dependency:tree -Dverbose命令,详细查看哪个第三方依赖间接引入了5.3.7版本的spring-aop或spring-expression,然后在该依赖中添加排除规则:
<dependency> <groupId>第三方依赖groupId</groupId> <artifactId>第三方依赖artifactId</artifactId> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> </exclusion> </exclusions> </dependency>
排除后,项目会自动使用你声明的5.3.27版本。
内容的提问来源于stack exchange,提问作者Kyeiv
相关产品推荐
相关产品推荐

