Spring Boot 3.x 的发布标志着整个 Spring 生态正式告别 Java 8 的兼容包袱,全面转向 Java 17 基线,并完成了从 Java EE 到 Jakarta EE 的命名空间迁移。这次大版本不仅仅是依赖版本的简单提升,它在底层字节码、运行时行为和第三方组件集成方式上都做了不少破坏性调整。对于维护旧系统的团队来说,理解这些变化背后的动机,比直接照着文档改包名更重要。

依赖与运行环境的硬性变更
Spring Boot 3.x 明确要求项目必须运行在 Java 17 或更高版本之上,构建工具如 Maven 或 Gradle 也需要使用能够编译 Java 17 的版本。这一点直接淘汰了仍在使用 Java 8 或 Java 11 的生产环境,如果团队的操作系统镜像或容器基础镜像没有预装 JDK 17,第一步就必须替换运行时。从长期维护角度看,Java 17 作为长期支持版本,具备更好的垃圾回收性能和更强的封装安全限制,这也是 Spring 官方选择它作为基线的核心原因。
除了 JDK 版本,最让开发者头疼的是 Jakarta EE 的包名切换。过去我们习惯引入 javax.persistence、javax.servlet 等包,在 Spring Boot 3 中它们全部变更为 jakarta.persistence、jakarta.servlet。这意味着不仅业务代码里的 import 要改,所有依赖了旧 Java EE 规范的第三方库也必须升级到兼容 Jakarta 的版本。例如 Hibernate 必须从 5.x 升到 6.x,Tomcat 内嵌版本也同步到了 10 以上。下面是一段 Maven 依赖调整的示例,展示了如何声明新的坐标。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.4.0.Final</version>
</dependency>
值得注意的是,一些老牌工具库如 JAXB、JAX-WS 已经从 JDK 中彻底移除,如果业务里用到 XML 绑定,需要手动引入 Jakarta 版的独立依赖。迁移时建议先使用 IDE 的全局替换功能把 javax. 批量改为 jakarta.,再逐个编译排查遗漏。这种机械替换能解决百分之八十的报错,剩下的是依赖不兼容问题,需要查对应库的发行说明。
代码层兼容与常见陷阱
在改写包名之外,Spring Boot 3 对部分 API 做了废弃和删除处理。例如 WebMvcConfigurer 中某些适配器方法被标记为过时,虽然暂时还能用,但编译器会给出警告。更隐蔽的问题是 Spring Security 的架构调整:原本基于 WebSecurityConfigurerAdapter 的继承写法被彻底移除,现在推荐用组件式声明,也就是直接暴露一个 SecurityFilterChain 的 Bean。这种变化要求开发者理解过滤链的组合方式,而不是简单地覆写父类方法。
另外一个容易踩坑的地方是配置属性的绑定规则。Spring Boot 3 增强了宽松绑定的校验,以前写成 spring.jpa.properties.hibernate.dialect 和 spring.jpa.properties.hibernate.DIALECT 都能被识别,现在更严格区分大小写与中划线格式。如果项目里依赖了自定义的 @ConfigurationProperties 类,最好检查一下字段命名是否和规范一致。以下代码展示了新的安全配置写法,对比旧版继承方式更为直观。
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConf {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated())
.formLogin();
return http.build();
}
}
对于使用了反射或字节码增强的框架(如 MapStruct、Lombok),也要确认其版本支持 Java 17。Lombok 低于 1.18.20 的版本在 Java 17 下会直接编译失败。建议在迁移前建一个独立分支,先只改 JDK 版本和包名,跑通单元测试后再逐步替换弃用 API,这样能降低排错成本。很多团队忽略了对测试代码的迁移,结果主代码改完了,测试里依旧引用 javax 导致流水线失败。
配置差异与上线策略
Spring Boot 3 对 application.properties 或 application.yml 中的部分默认行为做了调整。比如服务启动时的 Banner 显示、日志级别映射,以及 Actuator 端点的暴露规则都更为保守。默认情况下,除了 health 和 info,其他 Actuator 端点不再对外暴露,这提升了安全性,但也容易让运维在排查时发现监控接口 404。需要在配置中显式打开 management.endpoints.web.exposure.include。
迁移过程不建议一次性把生产环境切到 3.x。可以采用灰度方式:先在非核心服务上验证依赖树,再利用多模块项目特性,把基础模块升到 3.x 并发布为独立制品,业务模块暂时以兼容模式引用。如果系统规模较大,还可以借助 Spring Boot 提供的迁移工具 spring-boot-properties-migrator,它在开发期会打印出哪些配置项已变更,辅助人工修正。下表列出几个常用配置在 2.x 与 3.x 的对应关系。
| 配置项 | Spring Boot 2.x | Spring Boot 3.x |
|---|---|---|
| 服务端 Servlet 包 | javax.servlet | jakarta.servlet |
| Actuator 默认暴露 | 多数端点开放 | 仅 health,info |
| JDK 基线 | Java 8+ | Java 17+ |
上线前务必在预发环境完整跑一遍冒烟测试,特别留意序列化框架(如 Jackson)在 Java 17 强封装下对反射字段的访问限制。若应用使用了 native image 编译,Spring Boot 3 对 GraalVM 的支持也更为成熟,但需要在编译期额外配置反射元数据。整体来看,虽然迁移有成本,但换来的是更长周期的安全更新和云原生适配能力,对于计划长期维护的系统来说,这次升级是值得投入的。
Spring_Boot_3Java_17Jakarta_EE修改时间:2026-08-18 03:48:34