概述

Spring Boot 是一个快速启动新项目的优秀框架。它通过定义一组适用于大多数用户的依赖项,帮助开发者快速创建新应用。然而,在某些情况下,可能需要覆盖其中一个或多个依赖项版本。本文将探讨如何在 Spring Boot 中管理和覆盖依赖项及其版本。

1. 引言

Spring Boot 通过使用Bill of Materials (BOM) 来管理依赖关系。简而言之,Spring Boot 的 BOM 是一个 Maven POM 文件,其中包含大量的 dependencyManagement 部分,用于定义默认的库版本。

大多数 Spring Boot 项目都继承自 spring-boot-starter-parent 艺术品,它自身又继承自 spring-boot-dependencies。后者就是 Spring Boot BOM,它为应用程序选择使用时提供了默认的库版本。

2. Spring Boot BOM(物料清单)

让我们首先了解 Spring Boot 如何管理依赖版本。Spring Boot 通过 Maven 的 dependencyManagement 功能来实现这一点。BOM 可以指定,如果我们的应用程序选择使用这些库,它们将使用默认的版本。

例如,Spring Boot BOM 中的一个条目如下:

这意味着项目中任何依赖 ActiveMQ 的组件都将默认使用此版本。此外,注意到版本是通过占位符指定的。这是 Spring Boot BOM 中常见的做法,它在自己的 properties 部分提供此类属性和其他属性的值。

3. 覆盖 Spring Boot 管理的依赖版本

现在我们了解了 Spring Boot 如何管理依赖版本,接下来我们将探讨如何覆盖它们。

3.1. Maven

对于 Maven,我们有两种方法来覆盖 Spring Boot 管理的依赖版本。首先,对于 BOM 中使用占位符指定版本的任何依赖,我们只需在项目 POM 中设置该属性即可:

这样,任何使用 activemq.version 属性的依赖都会使用我们在项目 POM 中指定的版本,而不是 BOM 中的版本。

另外,如果在 BOM 的 dependency 标签中明确指定了版本,而不是作为占位符,那么我们可以在项目依赖项中直接覆盖 version 属性:

3.2. Gradle

Gradle 需要一个插件来处理来自 Spring Boot BOM 的依赖管理。因此,首先我们需要添加插件并导入 BOM:

现在,如果我们想覆盖特定依赖的特定版本,只需在 Gradle 的 ext 属性中指定对应于 BOM 的属性即可:

如果 BOM 中没有可供覆盖的属性,我们也可以在声明依赖时直接指定版本:

3.3. 注意事项

这里有几个需要注意的地方。

首先,要记住 Spring Boot 是使用其 BOM 中指定的库版本构建和测试的。每次我们指定不同的库版本,都有可能导致不兼容性。因此,偏离标准依赖版本时,务必对应用程序进行测试。

另外,请记住,这些技巧仅适用于使用 Spring Boot 物料清单(BOM)。对于 Maven,这意味着使用 Spring Boot 父亲。而对于 Gradle,这意味着使用 Spring 依赖插件。

4. 查找依赖版本

我们已经了解了 Spring Boot 如何管理依赖版本以及如何覆盖它们。本节将介绍如何查找项目中使用的库版本。这对于识别库版本并确认我们对项目应用的任何覆盖是否有效是很有用的。

4.1. Maven

Maven 提供了一个可以显示所有依赖及其版本的 目标。例如,运行命令:

输出类似:

输出显示了项目的所有依赖及其版本。这些依赖以树形结构呈现,便于识别每个库是如何被导入项目的。

在上述示例中,logback-classic 库是 spring-boot-starter-logging 库的依赖,而 spring-boot-starter-logging 又是 spring-boot-starter 模块的依赖。因此,我们可以沿着树向上追溯到顶级项目。

4.2. Gradle

Gradle 提供了一个生成类似依赖树的任务。例如,运行命令:

输出类似:

与 Maven 输出相似,我们可以轻松地确定每个库为何被拉入项目以及所使用的版本。

5. 总结

本文介绍了 Spring Boot 如何管理依赖版本,以及如何在 Maven 和 Gradle 中覆盖这些版本。最后,我们学习了如何在两种项目类型中验证依赖版本。