Ohhnews

分类导航

$ cd ..
Baeldung原文

如何在Spring Boot中升级Spring Framework版本

#spring boot#spring framework#依赖管理#maven#版本升级

[LOADING...]

1. 引言

Spring Boot 通过自动配置、依赖管理、内嵌服务器和生产级特性简化了 Java 应用开发。它构建在 Spring Framework 之上,后者提供了依赖注入、Spring MVC 和应用配置等特性。随着 Spring Framework 的演进,开发者可能需要采用更新的框架版本,以获得安全改进、缺陷修复、性能增强以及对更新 Java 版本的兼容选项。然而,升级并不只是修改版本号。Spring Boot 管理着多个相关依赖,因此开发者必须保持它们之间的兼容性。

在本教程中,我们将探讨如何在 Spring Boot 应用中安全且系统性地升级 Spring Framework 版本。首先,我们会研究 Spring Boot 如何管理 Spring Framework 依赖,以及如何识别应用所使用的版本。然后,我们会遵循推荐做法:通过升级 Spring Boot 来获得所需的 Spring Framework 版本。此外,我们还会使用 Maven 依赖树和有效 POM 来排查意外的依赖版本,并识别依赖管理冲突。最后,我们会回顾兼容性要求、迁移变更和最佳实践,以帮助升级后保持应用稳定。

2. Spring Boot 中的 Spring Framework 版本管理

Spring Boot 为每个发行版管理依赖版本。这种依赖管理包括应用所使用的 Spring Framework 模块。因此,应用可以声明 Spring 依赖,而无需逐个指定其版本

首先,Maven 项目可以使用 Spring Boot 父 POM:

$ xml
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>YOUR_BOOT_VERSION</version>
    <relativePath/>
</parent>

Spring Boot 父 POM 提供了对 Spring Boot 依赖管理的访问,其中包括 spring-boot-dependencies POM。该 POM 为 Spring Framework 模块和其他依赖定义了兼容版本。

因此,像 spring-web 这样的依赖可以在不显式指定版本的情况下声明:

$ xml
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
</dependency>

Maven 随后会从 Spring Boot 依赖管理中获取版本。这种方式可以让相关的 Spring Framework 模块保持一致,也避免了在整个应用中逐个定义版本。

当通过 Spring Boot starter 引入 Spring Framework 模块时,同样的机制也适用:

$ xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

starter 会引入所需的 Spring 依赖,而 Spring Boot 提供它们的管理版本。因此,应用可以使用一组一致的 Spring Framework 模块,而无需手动定义每个版本。

因此,在 Spring Boot 应用中升级 Spring Framework 需要理解这种依赖管理关系。由于 Spring Boot 为每个发行版管理框架版本,推荐做法是升级到能够提供所需 Spring Framework 版本的 Spring Boot 发行版。

3. 检查当前的 Spring Framework 版本

在升级 Spring Framework 之前,我们应该先识别应用当前使用的版本。Maven 依赖树可以显示构建期间解析出的版本。

我们可以使用 mvndependency:tree 子命令来检查它们:

$ bash
mvn dependency:tree -Dincludes=org.springframework

输出可能包含多个条目:

org.springframework:spring-core:jar:5.2.8.RELEASE
org.springframework:spring-web:jar:5.2.8.RELEASE 

每个条目都标识了一个 Spring Framework 模块以及 Maven 为其解析出的版本。然而,依赖树中显示的版本可能并不直接来自项目的 pom.xml。Spring Boot 可以通过其依赖管理提供版本。其他导入的 BOM 或依赖管理配置也可能影响最终解析出的版本。

因此,检查依赖树为我们提供了一个清晰的起点。一旦确定了当前版本,我们就可以确定哪个 Spring Boot 发行版提供了所需的新版本。下一节将说明这一升级过程。

4. 升级当前的 Spring Framework 版本

一旦我们知道当前的 Spring Framework 版本及其管理方式,下一步就是选择一个管理所需版本的 Spring Boot 发行版。

Spring Boot 为每个发行版管理一组兼容的依赖版本。因此,迁移到更新的 Boot 发行版会更新所管理的 Spring Framework 版本及其相关依赖。

4.1. 升级 Spring Boot 版本

要升级 Spring Boot,我们只需要修改父 POM 中声明的 Boot 版本:

$ xml
<version>NEW_BOOT_VERSION</version>

完成此更改后,Maven 会使用与新 Spring Boot 发行版关联的依赖管理配置。因此,应用会获得该发行版所管理的 Spring Framework 版本。我们不需要为各个 Spring Framework 模块指定版本,因为 Spring Boot 会继续管理它们。

4.2. 验证解析后的版本

完成升级后,再次运行依赖树。检查 Spring Framework 模块及其解析出的版本。它们应该与所选 Spring Boot 发行版管理的依赖版本相对应。

这种验证很重要,因为更改 Boot 版本并不能保证复杂项目中的每个依赖配置都会按预期工作。导入的 BOM 或内部库可能会影响解析出的版本。如果 Maven 解析出意外的 Spring Framework 版本,我们应该检查项目的有效 POM 和依赖树

为此,我们接下来解释如何追踪此类依赖管理问题。

5. 排查意外的依赖版本

升级 Spring Boot 后,Maven 应该解析出所选 Boot 发行版管理的 Spring Framework 版本。复杂项目可能包含额外的依赖管理配置,从而影响最终解析出的版本。例如,应用可能导入了另一个 BOM,或定义了自己的依赖管理条目,从而覆盖 Spring Boot 管理的版本。依赖还可能引入传递性的 Spring 模块,这也会影响依赖解析。

有效 POM 有助于追踪意外依赖版本的来源,因为它合并了继承和导入的依赖配置

我们先来生成它:

$ bash
mvn help:effective-pom

然后,我们搜索以下条目:

spring-boot-dependencies
spring-framework-bom

通过结合有效 POM 和依赖树进行检查,我们可以确定哪个依赖管理配置控制了解析出的 Spring Framework 版本,并排查可能的覆盖或冲突

6. 验证升级

升级 Spring Boot 会改变所管理的 Spring Framework 版本,并可能影响应用行为。因此,升级验证不应仅限于依赖解析。

6.1. 查看迁移变更

较新的 Spring Framework 发行版可能会引入 API 变更、弃用现有特性,或移除此前可用的 API。不同框架版本之间的配置行为也可能发生变化。因此,我们应该查看相关的迁移文档,并在必要时更新应用代码或配置。

6.2. 第三方依赖

应用还可能依赖与 Spring Framework 集成的库。这些库可能有自己的兼容性要求。升级后,我们应该测试安全、数据库访问、Web 端点以及其他基于 Spring 的集成等组件,以确保它们支持升级后的环境。

7. 最佳实践

在 Spring Boot 应用中升级 Spring Framework 时,我们应该遵循一些实践,以使升级过程可控且易于维护:

  • 优先升级 Spring Boot:我们应该选择能够管理所需 Spring Framework 版本的 Spring Boot 发行版。这样可以保持相关依赖一致。
  • 避免不必要的覆盖:当所选的 Spring Boot 发行版已经提供了所需版本时,我们不应手动指定 Spring Framework 版本。
  • 保持 Spring Framework 模块一致:我们不应为各个 Spring Framework 模块指定不同版本,因为这可能引入兼容性问题。

通过遵循上述建议,我们可以缓解许多即便有自动依赖管理仍然存在的问题。

8. 结论

在本文中,我们探讨了 Spring Boot 如何通过其依赖管理系统管理 Spring Framework 版本。由于 Spring Boot 提供了 Spring Framework 模块的兼容版本,升级框架通常从选择一个管理所需版本的 Spring Boot 发行版开始。这种方式可以保持框架模块一致,并避免不必要的依赖覆盖。

此外,我们使用 Maven 检查了解析出的框架版本,并通过有效 POM 和依赖树排查了意外的依赖版本。最后,我们回顾了升级后的发行版变更、第三方依赖和应用行为。这些步骤共同提供了一种结构化方式来升级 Spring Framework,同时保持依赖解析一致和应用兼容。