Spring Boot起步依赖的功能:开发者只需指定功能,构建过程自动分析用户需求,引入相关依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,通过依赖叠加,实现功能支持,因此很多依赖的命令都暗示了他们所提供的特定功能。
例如,你打算做一个web应用,有两种选择:一种是传统的向项目构建文件里添加一堆单独的库依赖;另一种,则是声明这个一个web应用程序,只需添加web起步依赖即可。
若想使用Thymeleaf为Web视图,用JPA来实现数据持久化,对应用程序进行测试,也可导入Thymeleaf、Spring Data JPA和Spring Boot的test的起步依赖。
上述依赖,加一起一共才五个依赖,却等价于一堆独立依赖库。
另外,起步依赖会自动决定他们引入的传递依赖的版本,使用者不用担心依赖冲突的问题。
当然,若使用者若想知道自动都使用了哪些库,在构建工具中也能找到相关的答案。在Gradle里,dependencies任务会显示一个依赖树,其中包含了项目所用的每个库以及它们的版本。在Maven里使用denpendency插件的tree目标也能获得相似的依赖树。
自定义依赖如何覆盖起步依赖
以Spring Boot的web起步依赖为例,它传递了Jackson JSON库,若你不想使用Jackson想将其从依赖中移除该怎么做呢?
若使用Gradle,可以通过exclude group进行依赖移除:
在Maven中,则可以使用元素来排除传递依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
</exclusion>
</exclusions>
</dependency>
另外,若项目需要使用另一个版本的Jackson(非Spring Boot依赖传递所提供的)来进行构建,在Maven中,可直接在pom.xml中表达:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</atrifactId>
<version>2.4.3</version>
</dependency>
Maven会使用最近的依赖,也就是说,你在项目构建说明文件里增加的这个依赖,会覆盖传递依赖引入的另一个依赖。
若使用Gradle,可以在build.gradle文件里指明你要的Jackson版本:
compile("com.fasterxml.jackson.core:jackson-databind:2.4.3")
注意:Gradle倾向使用库的最新版本,就是说若你使用的jackson版本要老于Spring Boot提供的版本,则不得不把web起步依赖中Spring Boot提供的版本剔除掉:
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实战 ,丁雪丰 (译者)