SpringBoot中的起步依赖(starter)是一组特定功能的依赖项集合,SpringBoot通过starter来进行项目的依赖管理,而不是直接基于单独的依赖项来进行依赖管理。
starter其实就是特殊的Maven依赖项或者Gradle依赖项,它把常用的库组合到一起构成了一个特定的功能。
举几个例子:spring-boot-starter-test是集成了测试功能的starter,spring-boot-starter-web是集成了web功能的starter,spring-boot-starter-data-mongodb是集成了MongoDB功能的starter。
starter中的依赖项都是经过官方精心测试的,能够保证相互之间的兼容性,最好不要进行更改。但是对于一些特定的场景、特定的需求来说也会遇到修改依赖项的时候,今天我们简单说一下如何进行修改。
测试目标:spring-boot-starter-web
我们项目里有2个starter,其中一个就是spring-boot-starter-web,我们就以它为目标进行依赖管理的测试。如图:
首先我们先通过以下maven命令查看一下spring-boot-starter-web有哪些依赖项。
mvn dependency:tree
从上图中我们可以看出我们项目依赖了spring-boot-starter-web,而spring-boot-starter-web又通过依赖传递依赖了jackson相关的jar包。我们接下来对jackson相关的包进行排除和替换,一起来看下需要什么操作。
排除依赖
如果我们需要把jackson相关的包移除掉该怎么办呢?很简单,直接在maven中通过标签就可以了,如图:
然后再查看一下依赖,就发现spring-boot-starter-json下已经没有jackson相关的包了:
maven的依赖管理原则
在对jackson相关的包进行替换之前,我们先看一下maven在处理依赖时的2个原则。
第一原则:路径最短者优先
比如说A对于C的依赖有2条路径,第一条路径为A->B->C(1.0),第二条路径为A->H->I->C(2.0),因为第一条路径的长度为2,第二条路径的长度为3,所以A采用路径最短的第一条路径下的C(1.0)。
第二原则:第一声明者优先
如果2条路径的长度都一样的话,那么此时第一声明者会被采用。
比如说A对于C的依赖有2条路径,第一条路径为A->B->C(1.0),第二条路径为A->H->C(2.0),此时第一条路径的长度和第二条路径的长度都是2,这个时候如果第一条路径先声明那么对于C的依赖就是1.0,如果是第二条路径先声明那么对于C的依赖就是2.0。
综上所述,大家应该能够发现,maven对于依赖项的管理和依赖项的版本没有关系。
替换依赖
替换依赖从字面上理解很简单,就是取代的意思,但是这里要讲清楚,替换包括高版本替换低版本和低版本替换高版本这两种。
根据maven的路径最短者优先的原则,如果我们想对jackson相关的包进行替换的话,我们直接在maven的pom文件中添加我们需要的特定版本的依赖项就可以了,而不用在意这个版本是更高的版本还是更低的版本,也不用再通过标签排除掉现有的版本,因为我们直接添加的依赖项路径更短。
下图是新添加的jackson相关的依赖,我们把改为更低的版本2.8.11:
我们再来查看一下依赖发现spring-boot-starter-json下已经没有的jackson相关的依赖,底部则直接添加了我们新配置的2.8.11版本的jackson相关的包。
需要注意的是这是maven的配置,我们只需添加我们需要的特定版本的依赖项就可以了,而不用担心是更高版本的依赖还是更低版本的依赖,因为我们直接添加的依赖项相对于starter中的依赖项来说路径更短。
但是对于Gradle管理的项目来说并不是这么直接简单,Gradle对于依赖项会优先使用最新的版本。
如果你想用低版本的依赖项,除了需要添加这个低版本的依赖项之外还需要排除掉高版本的依赖项才可以。
结束
今天的内容到此就讲完了,我们讲述了springboot中如何排除特定的依赖,如何替换特性的依赖。另外还讲了maven对于依赖管理的2条原则。
希望这些能够帮助到大家,如果大家有什么疑问欢饮留言哦。