拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 覆盖 Spring Boot 管理的依赖版本

覆盖 Spring Boot 管理的依赖版本

白鹭 - 2021-11-18 2379 0 2

一、简介

Spring Boot 是快速启动新项目的优秀框架。它帮助开发人员快速创建新应用程序的方法之一是定义一组适合大多数用户的依赖项。


但是,在某些情况下,可能需要覆盖一个或多个依赖项版本。


在本教程中,我们将了解如何覆盖 Spring Boot 托管依赖项及其版本

2. Spring Boot 物料清单 (BOM)

我们先来看看 Spring Boot 是如何管理依赖的。简而言之,Spring Boot 使用物料清单 (BOM) 来定义依赖项和版本。


大多数 Spring Boot 项目继承自spring-boot-starter-parent 工件,它本身继承自spring-boot-dependencies工件。后一个工件是 Spring Boot BOM ,它只是一个带有大dependencyManagement部分的 Maven POM 文件:

<dependencyManagement>
 <dependencies>
 <dependency>
 ... </dependency>
 <dependency>
 ... </dependency>
 </dependencies>
 </dependencyManagement>

通过使用 Maven 的dependencyManagement ,如果我们的应用程序选择使用它们,BOM 可以指定默认库版本。让我们看一个例子。


Spring Boot BOM 中的条目之一如下:

<dependency>
 <groupId>org.apache.activemq</groupId>
 <artifactId>activemq-amqp</artifactId>
 <version>${activemq.version}</version>
 </dependency>

这意味着项目中依赖 ActiveMQ 的任何工件都将默认获得此版本。


另外,请注意版本是使用属性 placeholder 指定的。这是 Spring Boot BOM 中的常见做法,它在自己的properties部分中为这个和其他属性提供值

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

现在我们了解了 Spring Boot 如何管理依赖版本,让我们看看我们可以覆盖它们。

3.1.Maven

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

<properties>
 <activemq.version>5.16.3</activemq.version>
 </properties>

这将导致任何使用activemq.version属性的依赖项使用我们指定的版本,而不是 Spring Boot BOM 中的版本。


此外,如果版本dependency标记中明确指定而不是作为占位符,那么我们可以简单地在项目依赖项条目中明确version

<dependency>
 <groupId>org.apache.activemq</groupId>
 <artifactId>activemq-amqp</artifactId>
 <version>5.16.3</version>
 </dependency>

3.2.Gradle

Gradle 需要一个插件来支持来自 Spring Boot BOM 的依赖管理。因此,要开始,我们必须包含插件并导入 BOM:

apply plugin: "io.spring.dependency-management"
 dependencyManagement {
 imports {
 mavenBom 'io.spring.platform:platform-bom:2.5.5'
 }
 }

现在,如果我们想覆盖特定版本的依赖项,我们只需要将 BOM 中的相应属性指定为 Gradle ext属性:

ext['activemq.version'] = '5.16.3'

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

compile 'org.apache.activemq:activemq-amqp:5.16.3'

3.3.注意事项

这里有几个警告值得一提。


首先,重要的是要记住 Spring Boot 是使用其 BOM 中指定的库版本构建和测试的。每当我们指定不同的库版本时,就有可能引入不兼容的风险。因此,每当我们偏离标准依赖版本时,都必须测试我们的应用程序。


另外,请记住,这些技巧仅适用于我们使用 Spring Boot 材料清单 (BOM) 的情况。对于 Maven,这意味着使用 Spring Boot 父级。对于 Gradle,这意味着使用 Spring 依赖项插件。

4. 查找依赖版本

我们已经看到 Spring Boot 如何管理依赖版本以及我们如何覆盖它们。在本节中,我们将了解如何找到项目正在使用的库的版本。这对于识别库版本和确认我们应用于项目的任何覆盖都得到遵守非常有用。

4.1.Maven

Maven提供了一个目标,我们可以使用它来显示所有依赖项及其版本的列表。例如,如果我们运行以下命令:

mvn dependency:tree

我们应该看到类似于以下内容的输出:

[INFO] org.1ju:dependency-demo:jar:0.0.1-SNAPSHOT
 [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.5.7-SNAPSHOT:compile
 [INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.5.7-SNAPSHOT:compile
 [INFO] | | +- org.springframework.boot:spring-boot:jar:2.5.7-SNAPSHOT:compile
 [INFO] | | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.5.7-SNAPSHOT:compile
 [INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:2.5.7-SNAPSHOT:compile
 [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.2.6:compile
 [INFO] | | | | \- ch.qos.logback:logback-core:jar:1.2.6:compile

输出显示作为项目依赖项的所有工件和版本。这些依赖关系以树状结构呈现,便于识别每个工件是如何导入到项目中的。


在上面的例子中, logback-classic工件是spring-boot-starter-logging库的一个依赖,它本身是spring-boot-starter模块的一个依赖。因此,我们可以向上导航回到我们的顶级项目

4.2. Gradle

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

gradle dependencies

我们将得到类似于以下内容的输出:

compileClasspath - Compile classpath for source set 'main'.
 \--- org.springframework.boot:spring-boot-starter-web -> 1.3.8.RELEASE
 +--- org.springframework.boot:spring-boot-starter:1.3.8.RELEASE
 | +--- org.springframework.boot:spring-boot:1.3.8.RELEASE
 | | +--- org.springframework:spring-core:4.2.8.RELEASE
 | | \--- org.springframework:spring-context:4.2.8.RELEASE
 | | +--- org.springframework:spring-aop:4.2.8.RELEASE

就像 Maven 输出一样,我们可以轻松识别为什么每个工件都被拉入项目,以及使用的版本。

5. 结论

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


0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *

热门标签