返回介绍

2.2.2 覆盖起步依赖引入的传递依赖

发布于 2025-04-21 21:10:06 字数 2289 浏览 0 评论 0 收藏

说到底,起步依赖和你项目里的其他依赖没什么区别。也就是说,你可以通过构建工具中的功能,选择性地覆盖它们引入的传递依赖的版本号,排除传递依赖,当然还可以为那些 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.33 。在 Maven 里,你可以直接在 pom.xml 中表达诉求,就像这样:

3 此处提到的版本仅作演示之用,Spring Boot 的 Web 起步依赖所引用的实际 Jackson 版本由你使用的 Spring Boot 版本决定。

<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)。

现在我们有了一个空的项目结构,构建说明文件也准备好了,是时候开发应用程序了。我们会让 Spring Boot 来处理配置细节,而我们自己则专注于编写阅读列表功能相关的代码。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。