扫描漏洞升级
不知道各位是否遇到过以下问题:
当下层项目将spring引入的某个依赖版本升级之后,上层项目只要指定了Springboot版本,那么还是会将这个版本改回去?
比如:现在有两个Springboot项目A、B,B项目会调用A项目中的某些方法,那么B项目就会依赖A项目。有一天,甲方通过漏洞扫描工具,扫描B项目时,发现A项目中有一个依赖的版本存在漏洞,让你升级,假设这个依赖是spring-web。
这时,你可能是想着去A项目里面,排除原本的Jar,引入新版本的jar,就如下面这样:
implementation ('org.springframework.boot:spring-boot-starter-web') {exclude group: "org.springframework", module: "spring-web"}implementation 'org.springframework:spring-web:6.0.3'
嗯,单独打开A项目,查看依赖关系,发现依赖正常,已经变成了6.0.3,ok,打包,一切正常。
emm......可是事情真的有那么简单吗?
Springboot强行覆盖
当然没那么简单,B项目引入新包A之后,你再去查看依赖,就会发现spring-web的版本又变了回去,你的修改并没有生效。
这一切都是因为Springboot的一个功能:定制管理版本(Customizing Managed Versions),只要上层指定了Springboot的版本,就会按照其内部指定版本管理依赖,下层修改根本不起作用。
如何升级
针对上面这种情况,Springboot有一个依赖管理器,里面管理了Spring 所需要的所有依赖,如果要修改依赖版本,按照他的方式指定即可。如果要指定slf4j的版本,仅需在gradle中加上ext['slf4j.version'] = '1.7.20'即可,这里提供官方的pdf。
同时,如果你想知道这个版本是否可以通过这种方式指定,你可以去Springboot的版本属性中查找,里面提供了spring引入的所有依赖。
参考文档
Spring Boot Gradle Plugin Reference Guide
Spring Boot Reference Documentation