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