准备迎接Spring Boot 3.0

准备迎接Spring Boot 3.0

原文地址:Preparing for Spring Boot 3.0

image.png Spring Boot 2.0 是 2.x 线的第一个版本,于 2018 年 2 月 28 日发布。我们刚刚发布了 Spring Boot 2.7,这意味着到目前为止,我们已经将 2.x 线维护了超过 4 年。 在此期间,我们总共发布了 95 个不同的版本!

整个 Spring 团队,以及我们社区中的许多贡献者,现在都在为下一代 Spring 做准备。 我们计划在 2022 年 11 月发布 Spring Boot 3.0。下一个主要版本将基于 Spring Framework 6.0,并且需要 Java 17 或更高版本。 它也将是第一个使用 Jakarta EE 9 API (jakarta.*) 而不是 EE 8 (javax.*) 的 Spring Boot 版本。

接下来的六个月提供了一个理想的机会,为自己的项目准备这个主要的版本。 在这篇博文中,我们将为您介绍现在可以做的一些事情,以便未来的迁移工作尽可能轻松。

升级到Java 17

Spring Boot 3.0 将需要 Java 17,但您无需等到该版本升级到最新的 LTS Java 版本。 任何最近的 Spring Boot 2.x 版本都可以很好地与 Java 17 配合使用。您还可以在自己的代码库中使用 Java 17 功能(例如:record)。

如果可能,我们强烈建议您立即升级 JDK。

升级到最新的Spring Boot 2.7.x

如果您当前使用的是旧版本的 Spring Boot 2.x,我们强烈建议您升级到 Spring Boot 2.7。 当 Spring Boot 3.0 发布时,我们将提供迁移指南,但它假定您是从 Spring Boot 2.7 而不是早期版本迁移。

我们的版本说明中一直会提供升级指南。 例如,如果您要从 Spring Boot 2.6 升级到 Spring Boot 2.7,就可以按照升级指南操作(https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.7-Release-Notes#upgrading-from-spring-boot-26)。

如果您从 Spring Boot 2.5 或更早版本升级,我们不建议跳过版本。 分步升级(例如 2.5 → 2.6 → 2.7)通常比尝试直接从 2.5 → 2.7 升级更容易。

检查对已废弃代码的调用

随着 Spring Boot 的发展,我们经常会弃用方法或类并提供替代品。 我们通常会提供 12 个月的重叠期,之后会删除不推荐使用的代码。 您可以在我们的 wiki(https://github.com/spring-projects/spring-boot/wiki/Deprecations)找到该政策的详细信息。

Spring Boot 3.0 将删除所有已弃用的代码,因此我们建议您检查现有代码是否已不依赖任何已弃用的方法。 如果提示了弃用警告,值得考虑使用 -Werror Java 编译器选项来使构建失败。

从旧版 application.propertiesapplication.yaml 处理迁移

Spring Boot 2.4 改变了application.propertiesapplication.yaml 文件的加载方式。 大多数用户都没有注意到这个更改,但一些项目可能已经将spring.config.use-legacy-processing 属性设置为 true 以旧行为运行。

旧版本的这项支持不会出现在 Spring Boot 3.0 中,因此您应该检查您的项目是否未设置spring.config.use-legacy-processing

使用Spring MVC的PathPatternParser

Spring MVC 提供了两种解析模式的方法。 从 Spring Boot 2.6 开始,默认使用 PathPatternParser

一些应用可能通过设置 spring.mvc.pathmatch.matching-strategy 属性手动切换回 AntPathMatcher 实现。 尽管这将在 Spring Boot 3.0版本继续工作,但我们建议尽量使用 PathPatternParser,因为它提供了更好的性能。

检查第三方项目是否有 Jakarta EE 9 兼容版本

Jakarta EE 9 是一个新的顶级 jakarta 包,取代了 EE 8 的 javax 顶级包。 例如,Jakarta EE 8 中的 Servlet 规范使用 javax.servlet 包,但在 EE 9 中已更改为 jakarta.servlet

一般来说,不可能在同一个项目中混合使用 Java EE 和 Jakarta EE API。 您需要确保您自己的代码以及所有第三方库都使用 jakarta.*包导入。

好消息是大多数维护良好的库都在生产 Jakarta EE 9 兼容的变体。 例如 Hibernate、Thymeleaf、Tomcat、Jetty 和 Undertow 都已经这样做了。

我们建议您花一些时间检查您使用的任何与 Jakarta EE 集成的第三方库,并检查它们是否具有兼容 EE 9 的变体。 我们发现的最常见是导入 Servlet API 的项目。

检查第三方项目是否更新了 Spring 兼容版本

Spring Framework 6.0 不会与上一代二进制兼容。 如果您正在使用提供Spring集成的第三方jar,您应该检查他们是否正在计划与 Spring Framework 6 兼容的版本。

试用Spring Boot里程碑版本

尽管我们不推荐将其用于生产,但您可以立即尝试 Spring Boot 3.0 里程碑版本,看看迁移项目的难度会有多难。 在代码的分支上尝试里程碑版本是发现任何潜在问题的好方法。

我们总是对反馈感兴趣,并且在我们发布 GA 版本之前发现错误时会让我们非常高兴。

您可以在 github.com/spring-projects/spring-boot/issues提出问题(确保告诉我们您正在使用的 Spring Boot 版本)。

考虑商业支持

Spring Boot 2.7 是 2.x 系列中的最后一个计划版本。 我们已将此版本的开源支持再延长 6 个月,直至 2023 年 11 月。

此外,对 Spring Boot 2.7 的商业支持也已延长,有效期至 2025 年 2 月。

您可以在 spring.io/projects/spring-boot 找到项目支持详细信息。 有关商业支持的详细信息,请访问 tanzu.vmware.com/spring-runtime

由商业支持请求触发的任何发布都将始终作为开源发布,因此商业客户也可以帮助开源社区。