Administrator
发布于 2022-09-11 / 32000 阅读
843

Spring Boot 3.0 与 Spring 6 迁移实战记录

提前迁移 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-pluginnative 构建和 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)

步骤动作验证
1JDK 升到 17java -version 显示 17
2Spring Boot 依赖升 3.0编译通过
3javax → jakarta 批量替换无 javax 残留引用
4第三方依赖对齐 Jakarta 版启动无 NoClassDefFound
5自定义 starter 改 AutoConfiguration 文件自动配置生效
6跑全量单测 + 集成测试绿灯

先到这

《Spring Boot 3.0 与 Spring 6 迁移实战记录》这块我前前后后踩了不止一次。今天先写这些,后面想到新的再补。

参考