springboot 覆盖起步依赖引入的传递依赖(读书摘抄)

来源于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 ,而是一个较早的版本呢? GradleMaven不太一样,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 )。
 

猜你喜欢

转载自blog.csdn.net/qq_39308071/article/details/113989443