提前迁移 Spring Boot 3.0:踩在 GA 前的准备
Spring Boot 3.0 要在 2022 年 11 月正式 GA,但我司有几个新服务打算直接基于 3.0 起项目,不想上线半年就面临大版本升级。于是我在 9 月就基于3.0 的里程碑/RC 候选版本做了一次迁移验证,把要改的点摸了一遍。下面这份迁移清单,是给团队提前准备的。
变更一:Jakarta EE 命名空间,最痛的一刀
Spring Boot 3.0 基于 Spring Framework 6,而 Spring 6 把 Java EE 换成了 Jakarta EE 9+。所有 javax.* 包名改成 jakarta.*。这不是简单重命名,而是包坐标整体迁移:
// 以前
import javax.persistence.Entity;
import javax.servlet.http.HttpServletRequest;
import javax.annotation.PostConstruct;
// 现在(Spring Boot 3.0)
import jakarta.persistence.Entity;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.annotation.PostConstruct;
我们用 OpenRewrite 的 MigrateToJakarta 配方批量改:
$ mvn org.openrewrite.maven:rewrite-maven-plugin:run \
-Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java \
-DactiveRecipes=org.openrewrite.java.migrate.jakarta.JakartaMigrationToJakarta
但要小心:第三方依赖如果还依赖 javax,会冲突。我们一个老报表组件用的旧版 Hibernate Validator 还引用 javax.validation,必须升到支持 Jakarta 的版本,否则启动直接 NoClassDefFoundError。
变更二:JDK 17 成为基线
Spring Boot 3.0 最低要求 JDK 17,不再支持 8 和 11。这其实和我们的升级计划不谋而合——基础组件评审刚决定统一到 17。但有些老库在 17 下会因为强封装(--illegal-access 默认 deny)挂掉,需要排查:
# 启动若报 InaccessibleObjectException,多半是反射访问内部 API
# 临时可加 --add-opens,但长期要换库
--add-opens java.base/java.lang=ALL-UNNAMED
变更三:原生镜像支持进主线
前面写过 GraalVM 实验性能力,在 3.0 里原生镜像支持被正式纳入 Spring Boot(通过 spring-boot-maven-plugin 的 native 构建和 AOT 处理)。这比之前的 Spring Native 独立项目顺滑很多:
# 生成 AOT 处理后的可执行文件
$ mvn -Pnative native:build
Spring 会在构建期做 AOT 处理:把 BeanFactory 的初始化逻辑在编译时尽量算好,并自动生成反射/资源/代理的 hint 配置文件,省去我们手动写 reflect-config.json 的大半功夫。
变更四:配置属性与自动配置的零星调整
spring.redis相关配置在 lettuce 升级后部分参数重命名,需对照 Release Notes 校验。- Spring Security 6 的默认安全过滤链和配置风格大改(见另一篇),用 Security 的服务要同步迁移。
- 废弃的
spring.factories自动配置机制改为META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,我们自定义 starter 要改。
我们的迁移清单(Checklist)
| 步骤 | 动作 | 验证 |
|---|---|---|
| 1 | JDK 升到 17 | java -version 显示 17 |
| 2 | Spring Boot 依赖升 3.0 | 编译通过 |
| 3 | javax → jakarta 批量替换 | 无 javax 残留引用 |
| 4 | 第三方依赖对齐 Jakarta 版 | 启动无 NoClassDefFound |
| 5 | 自定义 starter 改 AutoConfiguration 文件 | 自动配置生效 |
| 6 | 跑全量单测 + 集成测试 | 绿灯 |
先到这
《Spring Boot 3.0 与 Spring 6 迁移实战记录》这块我前前后后踩了不止一次。今天先写这些,后面想到新的再补。