



























最后更新:2026-07-02
适用场景:Spring Boot 2 升级 Spring Boot 3、JDK8 / JDK11 升级 JDK17、javax 迁移 jakarta、Spring Framework 6、Spring Security 6、Maven / Gradle 构建失败、Spring Boot 3 启动报错
Spring Boot 2 升级到 Spring Boot 3,不是简单把版本号从:
<version>2.7.x</version>
改成:
<version>3.x.x</version>
这么简单。
这次升级涉及一整套技术栈变化:
Java 17
Spring Framework 6
Jakarta EE 10
javax.* 到 jakarta.*
Spring Security 6
Hibernate 6
Maven / Gradle 版本
第三方 Starter 兼容性
构建工具和 CI/CD 环境
Spring Boot 3.0 官方迁移指南明确说明:Spring Boot 3.0 要求 Java 17 或更高版本,不再支持 Java 8,并且要求 Spring Framework 6.0。官方也建议在开始升级前,先把项目升级到最新的 Spring Boot 2.7.x 版本,再迁移到 Spring Boot 3。(GitHub)
本文按实际项目迁移顺序,整理 Spring Boot 2 升级到 Spring Boot 3 的完整流程、常见修改点和报错排查方法。
最稳的升级路径是:
1. 先升级到最新 Spring Boot 2.7.x
2. 清理 Spring Boot 2.x 中已经废弃的 API 和配置
3. 升级 JDK 到 17 或更高版本
4. 确认 Maven / Gradle / IDEA / CI 都使用 JDK17+
5. 检查 Spring Cloud、第三方 Starter、公司内部 SDK
6. 将 javax.* 相关依赖和代码迁移到 jakarta.*
7. 升级 Spring Boot 到 3.x
8. 处理配置属性变更
9. 处理 Spring Security 6 变更
10. 处理 JPA / Hibernate 6 变更
11. 运行完整测试
12. 最后再考虑 JDK21、JDK25 等更高版本
不要从很老的版本直接跳:
Spring Boot 2.1 -> Spring Boot 3.5
Spring Boot 2.3 -> Spring Boot 3.5
Spring Boot 2.5 -> Spring Boot 3.5
更推荐:
当前版本 -> 最新 2.7.x -> 3.x
Spring Boot 官方迁移文档也强调,升级前应先升级到最新可用的 2.7.x,以确保项目基于该分支中最新的依赖集合。(GitHub)
升级前先不要急着改版本号,先做一次环境和依赖盘点。
建议检查下面这些内容:
| 检查项 | 需要确认什么 |
|---|---|
| 当前 Spring Boot 版本 | 是 2.1、2.3、2.5、2.6 还是 2.7 |
| 当前 JDK 版本 | 是否已经是 JDK17 或更高 |
| Maven / Gradle 版本 | 是否能支持目标 JDK 和 Spring Boot 3 |
| Spring Cloud 版本 | 是否有对应 Spring Boot 3 的兼容版本 |
| Spring Security | 是否使用了旧配置方式 |
| JPA / Hibernate | 是否依赖 Hibernate 5 的行为 |
| javax 包 | 是否使用了 javax.servlet、javax.persistence、javax.validation 等 |
| 第三方 Starter | 是否支持 Spring Boot 3 |
| 公司内部 SDK | 是否仍依赖 Spring Boot 2 或 javax |
| CI/CD | 构建环境是否已升级 JDK17 |
| Docker 镜像 | 基础镜像是否仍是 JDK8 / JDK11 |
| 测试覆盖 | 是否有接口测试、集成测试、回归测试 |
一句话:
Spring Boot 2 升级 3,真正难的不是改 parent 版本,而是整条依赖链都要兼容。
不要直接从老版本跳到 Spring Boot 3。
如果你当前是:
Spring Boot 2.1
Spring Boot 2.3
Spring Boot 2.5
Spring Boot 2.6
建议先升级到:
Spring Boot 2.7.x
这样做有几个好处:
1. 先适配 Spring Boot 2.x 最后一个主线
2. 先处理 2.x 中已经废弃的配置和 API
3. 让依赖版本更接近 Spring Boot 3
4. 降低一次性升级跨度
5. 出问题时更容易定位
Spring Boot 3 迁移指南中也提醒,Spring Boot 2.x 中已经废弃的类、方法和属性,在 Spring Boot 3 中可能已经被移除,因此升级前应先清理这些废弃用法。(GitHub)
Maven 示例:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
Gradle 示例:
plugins {
id 'org.springframework.boot' version '2.7.18'
id 'io.spring.dependency-management' version '1.1.7'
}
先保证项目在 Spring Boot 2.7.x 下可以正常:
mvn clean test
mvn clean package
或者:
./gradlew clean test
./gradlew build
再进入下一步。
Spring Boot 3 最低要求 Java 17。Spring Boot 3.0 发布说明也明确提到,如果还在使用 Java 8 或 Java 11,需要先升级 JDK 才能开发 Spring Boot 3.0 应用。(GitHub)
建议优先选择:
JDK17
原因:
Spring Boot 3 的最低基线就是 JDK17
生态兼容性更稳
很多老项目从 JDK8 / 11 升级到 17 更容易控制风险
如果是新项目,可以考虑:
JDK21
但老项目迁移时,建议先完成:
Spring Boot 2 -> Spring Boot 3
JDK8 / 11 -> JDK17
等项目稳定后,再评估:
JDK17 -> JDK21
不要一次性同时做太多大升级。
java -version
javac -version
mvn -version
重点看:
Java version
Java home
./gradlew --version
或者 Windows:
gradlew.bat --version
如果你还没有安装 JDK17,可以看:
各版本JDK镜像下载地址:JDK8 / JDK11 / JDK17 / JDK21 / JDK25 / JDK26 下载与IDEA配置指南
Windows安装JDK与JAVA_HOME环境变量配置教程
Spring Boot 3 项目中,JDK 升级了,Maven / Gradle 也要一起检查。
建议使用 Maven 3.6.3 或更高版本。当前 Spring Boot 官方系统要求页面中,Spring Boot 4.1.0 明确列出 Maven 3.6.3+、Gradle 8.14+ 或 9.x;Spring Boot 3.x 的维护版本也普遍要求 Maven 3.6.3 或更高。(Home)
执行:
mvn -version
重点检查:
Maven版本
Java version
Java home
如果遇到 Maven 使用 JRE、没有编译器等问题,可以看:
No compiler is provided in this environment解决办法
Gradle 项目除了检查 Spring Boot 支持的 Gradle 版本,还要检查 Gradle 本身是否支持当前 JDK。
执行:
./gradlew --version
重点看:
Gradle版本
Launcher JVM
Daemon JVM
如果 Gradle Wrapper 太旧,可能会先报:
Unsupported class file major version
Could not open cp_settings generic class cache
Unsupported Java
可以参考:
Gradle国内镜像配置教程:init.gradle、repositories与Wrapper加速完整指南
原来可能是:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
</parent>
<properties>
<java.version>8</java.version>
</properties>
升级后改成:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.15</version>
</parent>
<properties>
<java.version>17</java.version>
</properties>
如果你想先升级到早期 3.x,也可以使用:
<version>3.0.13</version>
但实际项目中,更建议选择仍在维护的较新 3.x 分支。
原来:
plugins {
id 'org.springframework.boot' version '2.7.18'
id 'io.spring.dependency-management' version '1.1.7'
id 'java'
}
java {
sourceCompatibility = '1.8'
}
升级后:
plugins {
id 'org.springframework.boot' version '3.5.15'
id 'io.spring.dependency-management' version '1.1.7'
id 'java'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
如果你使用 Kotlin DSL:
plugins {
id("org.springframework.boot") version "3.5.15"
id("io.spring.dependency-management") version "1.1.7"
java
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
这是 Spring Boot 2 升级 3 最容易遇到的代码层面问题。
Spring Boot 3 迁移指南说明:Spring Boot 3.0 使用 Jakarta EE 10 相关规范,例如 Servlet 6.0 和 JPA 3.1;同时 Jakarta EE 包名使用 jakarta.*,而不是旧的 javax.*。(GitHub)
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
常见对应关系:
| Spring Boot 2 | Spring Boot 3 |
|---|---|
javax.servlet.* | jakarta.servlet.* |
javax.persistence.* | jakarta.persistence.* |
javax.validation.* | jakarta.validation.* |
javax.annotation.* | jakarta.annotation.* |
javax.transaction.* | jakarta.transaction.* |
但不要机械全局替换所有 javax。
例如下面这些仍属于 Java SE / JDK 相关包,不能随便替换:
javax.crypto.*
javax.net.ssl.*
javax.sql.DataSource
javax.xml.*
建议做法:
1. 先升级依赖
2. 再迁移编译报错的 javax 包
3. 不要一键全局替换所有 javax
4. 每次替换后运行测试
旧依赖:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
新依赖:
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
不过如果你使用:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
通常不需要自己手动引入 Servlet API。
旧依赖可能是:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
Spring Boot 项目中更推荐使用:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
代码中使用:
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
旧代码:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
新代码:
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
Spring Boot 3 升级失败,很多时候不是官方 Starter 的问题,而是第三方依赖没跟上。
重点检查:
Spring Cloud
MyBatis / MyBatis-Plus
Sa-Token
Swagger / Knife4j / Springdoc
ShardingSphere
Dubbo
XXL-JOB
Quartz
Elasticsearch Client
Redisson
公司内部SDK
自定义Starter
尤其注意这些情况:
仍依赖 javax.servlet
仍依赖 javax.validation
仍依赖 Hibernate 5
仍依赖 Spring Security 5
仍依赖旧版 Spring Framework
自定义自动配置仍使用旧 spring.factories 方式
Spring Boot 3 迁移指南提醒,如果项目中使用了 Spring Boot 没有管理的显式版本依赖,例如 Spring Cloud 或其他第三方组件,需要先确认兼容版本。(GitHub)
建议先执行:
mvn dependency:tree
或者:
./gradlew dependencies
看项目里是否还存在大量旧依赖。
如果项目使用 Spring Security,升级到 Spring Boot 3 时一定要重点检查。
Spring Boot 3.0 使用 Spring Security 6.0;官方迁移指南建议在升级到 Spring Boot 3.0 前,可以先将 Spring Boot 2.7 应用升级到 Spring Security 5.8,以简化迁移到 Spring Security 6.0 的过程。(GitHub)
Spring Security 5.7 起已经弃用 WebSecurityConfigurerAdapter,官方建议迁移到基于组件的配置方式,例如定义 SecurityFilterChain Bean。(Home)
旧写法:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin();
}
}
新写法示例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(form -> form.permitAll())
.build();
}
}
注意新旧方法名也有变化:
| 旧写法 | 新写法 |
|---|---|
authorizeRequests() | authorizeHttpRequests() |
antMatchers() | requestMatchers() |
继承 WebSecurityConfigurerAdapter | 声明 SecurityFilterChain Bean |
Spring Boot 3 中部分配置属性被重命名或移除。
官方迁移指南提供了 spring-boot-properties-migrator 模块,可以在应用启动时分析配置并打印诊断信息,还能临时迁移部分属性;但官方也提醒迁移完成后要移除该模块。(GitHub)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-properties-migrator</artifactId>
<scope>runtime</scope>
</dependency>
runtimeOnly("org.springframework.boot:spring-boot-properties-migrator")
启动应用后观察日志,处理配置提示。
处理完成后,删除该依赖:
不要长期把 spring-boot-properties-migrator 留在生产项目里。
如果你维护的是普通业务项目,通常不需要关心这个。
但如果你维护自定义 Starter,需要注意 Spring Boot 3 的自动配置注册方式变化。
Spring Boot 2.7 引入了:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
Spring Boot 3 中,使用 spring.factories 通过 org.springframework.boot.autoconfigure.EnableAutoConfiguration 注册自动配置的方式已被移除,应迁移到新的 imports 文件。(GitHub)
旧方式:
META-INF/spring.factories
内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.MyAutoConfiguration
新方式:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
内容:
com.example.demo.MyAutoConfiguration
如果你的公司内部有自定义 Starter,这是一个必须检查的点。
Spring Boot 3 使用 Jakarta Persistence,也就是 jakarta.persistence.* 包名。
常见问题包括:
javax.persistence.Entity 找不到
旧版本 Hibernate 类型处理器不兼容
自定义 Dialect 报错
SQL 生成行为变化
分页或懒加载行为变化
字段命名策略变化
常见迁移:
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
改成:
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import jakarta.persistence.Id;
如果项目使用 MyBatis,不代表完全不受影响。很多项目同时使用:
MyBatis
JPA注解
Validation注解
Servlet API
第三方Starter
所以仍然要全局搜索:
javax.
但不要盲目替换所有结果。
升级后,测试代码也经常报错。
常见问题:
JUnit 4老测试未迁移
Mockito版本过旧
Spring Security测试配置变化
MockMvc相关导入变化
javax.validation相关测试代码报错
测试配置属性被移除
建议至少执行:
mvn clean test
或者:
./gradlew test
如果项目没有测试,这次升级风险会明显更高。至少要人工覆盖:
登录认证
核心业务接口
数据库读写
文件上传下载
定时任务
消息队列消费
第三方接口调用
权限控制
很多项目本地跑通了,发到测试环境又挂了,原因是:
本地是 JDK17
CI/CD 还是 JDK8
Docker 镜像还是 openjdk:8
服务器 java -version 还是 1.8
检查 Dockerfile。
旧示例:
FROM openjdk:8-jdk
建议改成:
FROM eclipse-temurin:17-jdk
或者如果使用 JDK21:
FROM eclipse-temurin:21-jdk
CI/CD 中也要打印版本:
java -version
javac -version
mvn -version
Gradle 项目:
./gradlew --version
报错:
error: invalid source release: 17
常见原因:
pom.xml 要求 Java 17
但 Maven 实际使用的是 JDK8 或 JDK11
检查:
mvn -version
如果显示:
Java version: 1.8.0_xxx
那就说明 Maven 没有使用 JDK17。
解决:
1. 安装 JDK17
2. JAVA_HOME 指向 JDK17
3. Path 添加 %JAVA_HOME%\bin
4. IDEA Maven Runner JRE 改成 JDK17
5. 重新构建
Unsupported class file major version 61
major version 61 对应 Java 17。
常见原因:
某些 class 文件是 JDK17 编译的
但当前运行环境低于 JDK17
解决:
升级运行环境到 JDK17 或更高。
更多版本对照可以看:
Java版本号与class文件major version对照表
报错示例:
package javax.servlet does not exist
package javax.persistence does not exist
package javax.validation does not exist
原因:
Spring Boot 3 使用 jakarta.* 相关 API
项目代码仍然使用 javax.*
解决:
1. 升级对应依赖到 Jakarta 版本
2. 将业务代码中的相关 import 改为 jakarta.*
3. 检查第三方依赖是否仍使用 javax
4. 不要机械替换所有 javax
报错:
java.lang.ClassNotFoundException: javax.servlet.Filter
常见原因:
项目中某个第三方依赖仍然依赖旧的 javax.servlet API
排查:
mvn dependency:tree
搜索:
javax.servlet
如果某个旧 Starter 仍然依赖 javax.servlet,需要升级该 Starter,或者替换为支持 Spring Boot 3 的版本。
报错可能类似:
cannot find symbol: class WebSecurityConfigurerAdapter
或者:
class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter.class] cannot be opened because it does not exist
原因:
Spring Security 6 不再使用旧的 WebSecurityConfigurerAdapter 配置方式
解决:
使用 SecurityFilterChain Bean 方式重写安全配置。
可以参考本文第十节。
表现:
升级后某些配置不再生效
启动日志提示配置属性已废弃或未知
处理:
1. 加入 spring-boot-properties-migrator
2. 启动应用查看迁移提示
3. 修改 application.yml / application.properties
4. 删除 migrator 依赖
不要长期依赖 migrator 运行生产系统。
实际升级时,可以按下面清单执行:
1. 备份代码,建立升级分支
2. 升级到最新 Spring Boot 2.7.x
3. 清理 Spring Boot 2.x 废弃 API 和配置
4. 升级 JDK 到 17
5. 确认 mvn -version / gradle --version 使用 JDK17
6. 升级 Maven / Gradle Wrapper
7. 检查 Spring Cloud 和第三方 Starter
8. 升级 Spring Boot 到 3.x
9. 迁移 javax.* 到 jakarta.*
10. 修改 Spring Security 配置
11. 处理 JPA / Hibernate 相关问题
12. 加入 spring-boot-properties-migrator 检查配置
13. 运行单元测试和集成测试
14. 检查 Docker / CI / 服务器 JDK
15. 在测试环境灰度验证
16. 移除 spring-boot-properties-migrator
17. 准备回滚方案
不推荐一次性这样升级:
Spring Boot 2.3 -> Spring Boot 3.5
JDK8 -> JDK21
Spring Security 5 -> 6
Hibernate 5 -> 6
MyBatis-Plus大版本升级
Spring Cloud大版本升级
Docker镜像换JDK21
这样一旦出错,很难判断是哪个变化导致的。
更稳的策略是:
第一阶段:Spring Boot升级到2.7.x
第二阶段:JDK升级到17
第三阶段:Spring Boot升级到3.x
第四阶段:处理jakarta和依赖兼容
第五阶段:稳定后再评估JDK21或更高版本
Spring Boot 迁移指南列出了几类辅助迁移工具,包括 OpenRewrite、Spring Boot Migrator 和 IntelliJ IDEA 的迁移支持。(GitHub)
这些工具可以帮助做:
包名替换
配置迁移
部分API替换
依赖升级提示
但不要完全依赖工具。
原因:
业务代码语义需要人工判断
第三方依赖兼容性需要人工确认
安全配置迁移需要测试
数据库行为变化需要验证
比较稳的做法:
工具辅助迁移 + 人工Code Review + 自动化测试 + 测试环境验证
是的,Spring Boot 3.0 要求 Java 17 或更高版本,不再支持 Java 8。(GitHub)
可以,但不建议从很老的 2.x 直接跳。官方建议升级前先升到最新可用的 2.7.x。(GitHub)
不是。Servlet、JPA、Validation 等 Jakarta EE 相关包要迁移,但不要全局机械替换所有 javax,例如 javax.net.ssl、javax.crypto、javax.sql 等不应该随便改。
因为 Spring Boot 3 使用 Jakarta Persistence,对应包名是:
jakarta.persistence.*
不是:
javax.persistence.*
Spring Boot 3 使用 Spring Security 6。旧的 WebSecurityConfigurerAdapter 配置方式已经不适合,需要迁移到 SecurityFilterChain Bean 方式。
可以临时使用:
spring-boot-properties-migrator
启动后查看日志提示,修改配置,完成后删除该依赖。(GitHub)
通常是 Maven 使用了 JRE 或错误 JDK。
可以查看:
No compiler is provided in this environment解决办法
major version 61 对应 Java 17。说明当前运行或构建环境低于 JDK17,无法识别 Java 17 编译出的 class 文件。
老项目不建议一开始就同时升级到 JDK21。更稳的做法是先升级到 Spring Boot 3 + JDK17,稳定后再评估 JDK21。
通常不需要直接改数据库,但 JPA / Hibernate 行为变化可能影响 SQL、字段映射、懒加载、Dialect、自定义类型等。使用 JPA 的项目一定要做完整回归测试。
Spring Boot 2 升级到 Spring Boot 3,核心变化有三件事:
1. Java 基线提升到 JDK17
2. Spring Framework 升级到 6
3. Java EE / javax 迁移到 Jakarta EE / jakarta
最稳升级路线:
Spring Boot 2.x -> 最新 2.7.x -> JDK17 -> Spring Boot 3.x -> jakarta迁移 -> 依赖兼容验证
重点检查:
JDK17
Maven / Gradle
javax -> jakarta
Spring Security 6
Hibernate 6
Spring Cloud
第三方Starter
自定义Starter
Docker / CI / 服务器JDK
配置属性变更
自动化测试
不要把它当成一次简单版本号升级。对真实项目来说,这更像一次 Java 后端基础栈升级。
Spring Boot 与 JDK 版本兼容:
Spring Boot与JDK版本兼容表:Spring Boot 2.x / 3.x / 4.x应该用哪个Java版本?
JDK 下载地址:
各版本JDK镜像下载地址:JDK8 / JDK11 / JDK17 / JDK21 / JDK25 / JDK26 下载与IDEA配置指南
Windows 安装 JDK:
Windows安装JDK与JAVA_HOME环境变量配置教程
IDEA 配置 JDK:
Java class 版本对照:
Java版本号与class文件major version对照表
Maven 编译器错误:
No compiler is provided in this environment解决办法
Maven 国内镜像:
完整环境专题:
2026-07-02:
- 创建 Spring Boot 2 升级 Spring Boot 3 完整指南
- 增加 JDK17 升级说明
- 增加 javax 到 jakarta 迁移示例
- 增加 Spring Security 6 配置迁移示例
- 增加 spring-boot-properties-migrator 使用说明
- 增加自定义 Starter 自动配置迁移说明
- 增加常见报错和排查清单
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。