Boot 3 的倒计时已经打到了最后一格。
2026 年 6 月 30 日,Spring Boot 3.5 的 OSS 支持正式截止。这是 Boot 3 系列最后一个 minor 版本,过了这个日期,Spring 官方不再为 Boot 3 提供安全补丁和 bug 修复。
| 版本 | OSS 支持截止 | 状态 |
|---|---|---|
| 3.0 ~ 3.4 | 2023-12 ~ 2025-12 | 全部 EOL |
| 3.5 | 2026-06-30 | 即将 EOF |
| 4.0 | 2026-12-31 | 活跃维护 |
不是追新,是 Boot 3 已经快没人管了。

古法编程依旧重要
AI 工具太方便以后,我们很容易默认自己不用再学新特性了,把升级任务丢给 AI,让它改依赖、换包名、修编译,最后人只负责点一下合并。
在真正迁移 Spring Boot 4 之前,我们认真考虑过这个问题:能不能让 AI 帮我们做迁移?
理论上看起来很香。把 pom.xml 甩给 Claude 或者 Codex,让它帮你把 Boot 3 的依赖改成 Boot 4 的,再扫一遍代码改包路径,几分钟搞定。
试了,不行。(笔者在 Opus 4.7 + Codex 5.5 xHigh 测试)
Boot 4 的 GA 版本是 2025 年 11 月发布的,大多数 AI 的训练数据截止在这之前,给你的包路径大概率是 Boot 2、3 的旧地址,看着合理,编译或运行时才爆。幻觉问题也是,Boot 4 对包结构的拆分很细,AI 容易把独立出来的 spring-boot-cache、spring-boot-jdbc 拼错。
最后的做法是先跑 OpenRewrite,自动改掉能改的,剩下靠人盯。
OpenRewrite 是一个代码自动化重构工具,最初由 Netflix 开源,现在由 Moderne 维护。它的核心思路是把代码迁移任务封装成”Recipe”(配方),由工具自动扫描和修改代码,不需要人逐行去改。Spring 官方提供了专门针对 Boot 升级的 Recipe,在
pom.xml里加几行配置跑一下 Maven 就能执行。
UpgradeSpringBoot_4_0 Recipe 主要帮我们做了这几件事:
spring-boot-starter-web→spring-boot-starter-webmvc(Boot 4 明确拆分了 MVC 和 WebFlux)- 移除 Undertow 依赖和相关配置(Boot 4 不再支持 Undertow)
- 新增
spring.jackson.use-jackson2-defaults: true(明确使用 Jackson 2 默认行为) management.endpoints.access.default: none(Actuator 默认不暴露端点)- OAuth2 Authorization Server 包路径更新
自动化能覆盖约三成,七成还是手工。
依赖优化
主版本升级是重头戏。根 pom.xml 的变动:
1 | <!-- Before --> |
Spring Boot 自身的模块化拆分
Boot 4 对自身的 Starter 做了更明确的拆分,这部分变动比第三方依赖更容易被忽略。几个影响面比较广的:
| Boot 3 | Boot 4 | 说明 |
|---|---|---|
spring-boot-starter-web |
spring-boot-starter-webmvc |
MVC 和 WebFlux 明确分离,MVC 服务直接声明 webmvc |
spring-boot-starter-aop |
spring-boot-starter-aspectj |
AOP 坐标更明确,涉及审计、幂等、日志等横切模块 |
spring-boot-starter-json |
spring-boot-jackson2 |
Jackson 从 web 依赖树里独立出来 |
spring-cloud-gateway-server |
spring-cloud-gateway-server-webflux |
网关明确区分 WebFlux 版本 |
AOP 这个变更容易踩到:PIGX 里审计模块、Excel 模块、幂等模块都依赖 AOP,Boot 3 时用 spring-boot-starter-aop 可以隐式拿到,Boot 4 要显式声明 spring-boot-starter-aspectj,不加就是运行时切面失效,不报错也不生效。
自动配置类路径同样做了拆分,如果你的代码里有 exclude = {XxxAutoConfiguration.class} 的写法,要同步检查路径是否还对。比较典型的几个变化:
1 | # Boot 3 |
第三方 Starter 的版本对齐
Boot 3 时代的第三方 Starter 大量使用 spring-boot3-starter-* 命名,Boot 4 有对应的独立坐标,替换前要把旧的彻底清干净:
| 模块 | Boot 3 | Boot 4 |
|---|---|---|
| 动态数据源 | dynamic-datasource-spring-boot3-starter |
dynamic-datasource-spring-boot4-starter |
| Druid | druid-spring-boot-3-starter |
druid-spring-boot-4-starter |
| GoView | goview-spring-boot3-starter |
goview-spring-boot4-starter |
同步升级的第三方依赖:Flowable 7.x → 8.0.0、XXL-Job → 3.4.0、Druid → 1.2.28、Nacos Client → 3.1.2、Seata → 2.5.0。OSS 模块从 AWS SDK v1 迁移到了 v2,顺手把 AmazonS3 换成同步 S3Client,接口更简洁。
有个容易被忽略的坑:javax.servlet-api 和旧版 spring-security-oauth2 要从 BOM 里彻底清掉。不清干净,下游模块会出现传递依赖冲突——编译能过,运行时类加载失败。Boot 4 全面切到 Jakarta EE,javax.* 包已经不在了,留着就是定时炸弹。
Jackson 3,我们没升
Spring Boot 4 默认切到了 Jackson 3,这是本次升级最大的破坏性变更之一。
Jackson 3 相比 Jackson 2 的 API 层面变化不小:ObjectMapper 行为有差异,部分注解改名,JsonMapper 成了推荐用法。
不是不想升。是升了之后,生态跟不上。
PIGX 的用户场景比较特殊:框架对外提供的是 Starter,下游用户可能还挂着大量依赖 Jackson 2 的第三方 Starter,比如各种报表、流程、消息组件。如果我们升到 Jackson 3,这些组件在序列化层面就会和框架产生冲突,用户需要同步替换所有第三方依赖,迁移成本无法控制。
我们的选择:本期不升 Jackson 3,继续用 Jackson 2。Boot 4 提供了向下兼容的配置支持,一个配置项搞定大部分问题:
1 | spring: |
但这一个配置不够。Jackson 在 PIGX 里有五条独立的路径:MVC 的 HTTP 响应序列化、Feign 的服务间调用、Redis 的缓存序列化、XSS 清洗的反序列化、日志脱敏的序列化。每条路径都要明确接入统一的 Jackson 2 ObjectMapper,否则会出现”同一个对象,不同路径序列化结果不一样”的诡异 bug。
Feign 那条路最麻烦。Boot 4 环境下 OpenFeign 默认用 Jackson 3,服务间调用的 HttpMessageConverter 列表要单独替换:
1 |
|
Jackson 3 的完整迁移会在后续版本单独处理,本期目标是稳定上线。
Nacos:官方不升,我们自己来
这是整个升级过程里最出乎意料的部分。
PIGX 使用 Nacos 作为注册和配置中心。Boot 4 升级完成后,Nacos Server 本身也需要适配,因为 Nacos 内部有大量的 javax.* 包和 Jackson 相关代码。
我们联系了 Nacos 官方团队,得到的回复是:暂时没有支持 Spring Boot 4 的计划。
没有计划就自己搞。我们 fork 了一个分支 pig-mesh/nacos,主要处理了三类问题:
javax → jakarta 迁移。 Nacos 代码里大量使用了 javax.servlet.*、javax.annotation.* 等包,需要全量迁移到 jakarta.*。这部分工作量不小,但机械性强,可以批量处理。
JSON 升级后认证鉴权报错。 Nacos 内部的 JSON 序列化升级之后,认证 token 的解析出现问题,导致鉴权失败。根因是序列化库版本切换后某些字段的处理方式变了,手动修复兼容逻辑。
Jraft 升级后 raft 选举失败。 这个最难定位。Nacos 集群模式依赖 Jraft 做 raft 共识,升级 Jraft 版本之后,选举过程中出现状态机异常,集群无法选出 Leader。最终通过一路修到发电厂 编译一个新的 Jraft 版本来解决这个问题。
详细日志
后端变更明细
| 内容 |
|---|
pigx-register Nacos 版本更新到 3.2.2 |
| 代码生成支持实体生成到独立 API 模块 |
重构微信小程序登录,由 openid 改为手机号登录 |
| 更新 XXL-Job Admin 配置 |
| 增加 AGENTS.md 和 CLAUDE.md 编码行为准则 |
| 新增模型并更新任务调度相关应用结构 |
Boot 4 替换 xxl-job-admin |
| 新增密码规则预设功能 |
| 重构数据源类型枚举,新增 AnyLine 解析适配器字段及插件状态查询 |
解耦 pigx-common-data 对 pigx-common-security 的依赖 |
| 统一验证码校验逻辑并新增短信验证码前置校验 |
OSS 操作从 S3AsyncClient 迁移至同步 S3Client |
| 重构 Excel 模块,引入内置转换器注册机制并优化 Excel 读写流程 |
| 审计模块支持通过主键自动获取对象进行比对 |
| 优化 WebSocket 缓冲区配置并移除 Undertow 依赖 |
| 流程分组 ID 为空时查询所有未隐藏流程 |
| 支持微信支付 APIV3 回调与下单 |
| APP 模块重构支持 TOB,新增角色底部导航管理功能及相关接口实体 |
| 认证模块增加 SM4 国密算法支持并优化密码解密逻辑 |
| 优化解密逻辑,重构 AES 加解密实现并增加 SM4 密钥校验 |
pigx-common-core 降级 Jackson 3 到 Jackson 2 并重构配置 |
修复 Feign HttpMessageConverterCustomizer 的 UnsupportedOperationException |

前端变更明细

| 内容 |
|---|
| 优化面包屑背景、菜单栏颜色、高亮背景、全局颜色、暗黑表头和 Element 激活/ 悬停状态 |
| 优化站点配置样式和结构,简化部分组件布局 |
FormTable 新增自定义新增方法和最大高度属性,优化表格显示 |
| 修复建表表名校验逻辑,确保正确处理表名存在性检查 |
| 添加站点配置表单类型和元数据定义,优化个人信息页面表格样式 |
| 同步 Boot 4 剩余布局和后台管理更新 |
| 优化审计日志组件布局和权限控制,增加系统日志折线图权限控制并初始化系统日志列表 |
| 重构支付二维码组件,优化支付方式选择和界面布局 |
| 根据角色动态控制首页 widget 展示 |
| 添加编码行为准则,强调编码前思考、简化、局部修改和目标导向执行 |
| 添加请求折线图提示,优化设备分布、热门页面和系统日志组件布局 |
| 新增外部和内部密钥管理功能,优化社交登录配置界面 |
| 添加数据源解析插件相关功能和表单验证提示 |
| 添加字典项排序和菜单排序功能 |
重构验证码发送逻辑,整合 SmsCodeVerifyButton 组件 |
| 精简移动端页面链接列表,移除不必要页面项 |
| 新增移动端流程启动和任务处理页面 |
| 修复部门选择器面包屑跳转 |
| 站点配置新增登录失败锁定功能,支持配置连续失败次数 |
| 优化侧边栏标题显示逻辑,支持国际化翻译 |
| 支持 SM4 加密算法,优化加密解密逻辑 |
使用 useToNumber 处理分页相关数据,兼容字符串和数字类型 |
| 批量升级 npm 依赖 |
更新 unplugin-auto-import 至 0.18.0 |
总结&资源汇总
虽然 AI 正在快速改变软件开发的方式,Vibe Coding 也让写代码变得更加高效,但它并没有改变企业级软件对稳定性、可维护性和工程质量的要求。
我们始终认为,所谓“古法编程”并没有过时。扎实的框架设计、清晰的架构边界、稳定的基础能力,依然是各类项目最核心的价值。
PIGX 始终致力于构建高质量、稳定的企业级开发底座,为 AI 时代的软件开发提供可靠支撑。
- PIGX 6.0 代码下载:https://pig4cloud.com/data/other/form3.html?v=2026
- PIGX 6.0 详细介绍:https://paper.pig4cloud.com
- PIGX 6.0 演示环境:http://home.pig4cloud.com:38081