spring boot 2.5 到 3.2 是结构性迁移而非平滑升级,需强制 jdk 17+、全量替换 javax→jakarta 包名、适配 spring framework 6/hibernate 6/jackson 3 等断崖式变更,并手动修复配置项、注解及依赖冲突。

Spring Boot 2.5 到 3.2 不是平滑升级,而是结构性迁移,兼容性差、破坏性强,不能“安装即用”,必须系统性改造。核心问题不在“装不装得上”,而在于底层契约已彻底变更。
JDK 版本硬性不兼容
Spring Boot 2.5 支持 JDK 8~17(推荐 JDK 11),而 3.2 强制要求 JDK 17+,且深度依赖 JDK 17 的特性(如密封类、模式匹配、ZGC)和 JDK 21 的虚拟线程(3.2.0+ 原生支持)。
- 若项目仍在 JDK 8/11 环境运行,连启动都会失败:
UnsupportedClassVersionError或java.lang.NoClassDefFoundError: javax/servlet/ServletContext。 - 升级 JDK 不是改个环境变量就行,需验证所有 JNI 调用、字节码操作库(如 ByteBuddy、CGLIB)、安全策略文件、JVM 参数(如
-XX:+UseG1GC在 JDK 17 中行为已变)。
Jakarta EE 包名全量替换,编译即报错
Spring Boot 2.5 基于 Java EE 8(javax.*),3.2 基于 Jakarta EE 9+(jakarta.*),这是源码级不兼容:
- 所有
import javax.servlet.*、javax.validation.*、javax.persistence.*等必须手动或批量替换为对应jakarta.*; - 第三方 Starter(如
spring-boot-starter-data-jpa)内部也已切换,若混用旧版 Hibernate 5.x 或旧版 validation-api,会直接抛IncompatibleClassChangeError; - IDE 可能自动导入错误包(尤其在 Ctrl+Space 补全时),需全局检查
javax引用残留。
Spring Framework 与关键依赖断崖式升级
| 组件 | Spring Boot 2.5 实际依赖 | Spring Boot 3.2 实际依赖 | 兼容风险点 |
|---|---|---|---|
| Spring Framework | 5.3.x | 6.1.x | 移除 WebSecurityConfigurerAdapter,@EnableWebSecurity 默认启用严格模式 |
| Hibernate | 5.4/5.6 | 6.2/6.4 |
@GeneratedValue(strategy = GenerationType.AUTO) 行为变更,默认改用 IDENTITY;@Column 的 nullable=false 不再自动生成 NOT NULL DDL |
| Jackson | 2.13.x | 3.0.x |
@JsonInclude(Include.NON_NULL) 默认策略变化;ObjectMapper 构造方式调整,new ObjectMapper() 不再启用默认模块 |
| Tomcat | 9.0.x | 10.1.x | 完全基于 jakarta.servlet,web.xml 部署描述符被弃用 |
⚠️ 注意:即使你只改
<version>3.2.0</version>,Maven 也会拉取全套新依赖。但若项目中显式声明了旧版spring-webmvc:5.3.31,就会引发NoSuchMethodError——因为 Spring Framework 6 删除了大量org.springframework.web.method.support.*中的 protected 方法。
配置项、注解、自动配置逻辑大面积失效
-
application.yml中大量属性重命名或删除:server.context-path→server.servlet.context-path,spring.jackson.deserialization.*下的键全部移至spring.jackson.deserialization-feature.*; -
@ConfigurationProperties必须配合@ConstructorBinding或启用@Validated,否则绑定失败静默忽略; - Actuator 端点路径前缀从
/actuator变为/actuator(表面没变),但响应结构、认证逻辑、敏感字段默认暴露策略全面收紧; -
spring-boot-properties-migrator只能提示警告日志,不会自动修复代码或配置,仍需人工逐条确认。
基本上就这些。











