来源于spring Boot 实战2.2.2
起步依赖和你项目里的其他依赖没什么区别。也就是说,你可以通过构建工具中的 功能,选择性地覆盖它们引入的传递依赖的版本号,排除传递依赖,
当然还可以为那些Spring Boot 起步依赖没有涵盖的库指定依赖。 以Spring Boot
的
Web
起步依赖为例,它传递依赖了
Jackson JSON
库。如果你正在构建一个生
产或消费
JSON
资源表述的
REST
服务,那它会很有用。但是,要构建传统的面向人类用户的
Web 应用程序,你可能用不上Jackson
。虽然把它加进来也不会有什么坏处,
但排除掉它的传递依赖, 可以为你的项目瘦身。
一,排除传递依赖
如果在用
Gradle,你可以这样排除传递依赖:
compile("org.springframework.boot:spring-boot-starter-web") {
exclude group: 'com.fasterxml.jackson.core'
}
在Maven里,可以用<exclusions>元素来排除传递依赖。下面这个引入Spring Boot的
build.gradle
的
<dependency>
增加了
<exclusions>
元素去除
Jackson
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
</exclusions>
</dependency>
二,引入的传递依赖
另一方面,也许项目需要
Jackson
,但你需要用另一个版本的
Jackson
来进行构建,而不是
Web 起步依赖里的那个。
假设Web
起步依赖引用了
Jackson 2.3.4
,但你需要使用
2.4.3
。在
Maven
里,
你可以直接在
pom.xml
中表达诉求,就像这样:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.3</version>
</dependency>
Maven总是会用最近的依赖,也就是说,你在项目的构建说明文件里增加的这个依赖,会覆
盖传递依赖引入的另一个依赖。
与之类似,如果你用的是
Gradle
,可以在
build.gradle
文件里指明你要的
Jackson
的版本:
compile("com.fasterxml.jackson.core:jackson-databind:2.4.3")
因为这个依赖的版本比
Spring Boot
的
Web
起步依赖引入的要新,所以在
Gradle
里是生效的。
但假如你要的不是新版本的
Jackson
,而是一个较早的版本呢?
Gradle和Maven不太一样,Gradle
倾向于使用库的最新版本。因此,如果你要使用老版本的
Jackon
,则不得不把老版本的依赖加入
构建,并把
Web
起步依赖传递依赖的那个版本排除掉:
compile("org.springframework.boot:spring-boot-starter-web") {
exclude group: 'com.fasterxml.jackson.core'
}
compile("com.fasterxml.jackson.core:jackson-databind:2.3.1")
不管什么情况,在覆盖
Spring Boot
起步依赖引入的传递依赖时都要多加小心。虽然不同的版
本放在一起也许没什么问题,但你要知道,起步依赖中各个依赖版本之间的兼容性都经过了精心
的测试。应该只在特殊的情况下覆盖这些传递依赖(比如新版本修复了一个
bug
)。