🚀 将您的遗留 Java 8 + Spring Boot 2.1 项目升级到 Java 17(不致于全部崩溃)
发布: (2025年12月11日 GMT+8 11:21)
3 min read
原文: Dev.to
Source: Dev.to
好处
- LTS 直至 2029 – 长期支持与安全更新
- 40–60 % 更快的 JVM – 更好的 GC(G1/ZGC),执行速度提升
- 现代语言特性 –
var、record、sealed class、switch 表达式 - 更佳的内存使用 – 减少堆占用
- 更安全 – 更强的 TLS、加密、JVM 规则
升级路径
| 阶段 | 从 → 到 |
|---|---|
| 1 | Java 8 → Java 11 |
| 2 | Spring Boot 2.1 → 2.7 |
| 3 | Java 11 → Java 17 |
| 4 | Spring Boot 2.7 → 3.x (Jakarta) |
pom.xml 更改
将 Java 版本设为 11(阶段 1)
11
添加缺失的 Java EE 模块(Java 11)
javax.xml.bind
jaxb-api
2.3.1
更新 Spring Boot 版本(阶段 2)
org.springframework.boot
spring-boot-starter-parent
2.7.18
将 Java 版本设为 17(阶段 3)
17
升级到 Spring Boot 3.x(阶段 4)
org.springframework.boot
spring-boot-starter-parent
3.3.4
Spring Boot 3 之前的调整
- 用 springdoc‑openapi 替换 Springfox
- 将
@ConfigurationProperties改为新的构造函数绑定方式 - 清理已废弃的 Spring Security 配置
- (可选)开始从
RestTemplate迁移到WebClient
添加 springdoc‑openapi 依赖
org.springdoc
springdoc-openapi-starter-webmvc-ui
2.6.0
常见修复
- 反射警告 – 暂时添加
--add-opensJVM 参数 - 用现代客户端(如
WebClient)替换所有旧的 HTTP 客户端 - 确保所有第三方库都支持 Java 17
包迁移示例(Jakarta)
// 之前(Spring Boot 2.x)
import javax.servlet.http.HttpServletRequest;
// 之后(Spring Boot 3.x)
import jakarta.servlet.http.HttpServletRequest;
在代码库中搜索剩余的 javax 导入:
grep -R "javax" src/
Spring Security API 变化
// 旧版(Spring Security 5.x)
http.authorizeRequests().anyRequest().authenticated();
// 新版(Spring Security 6.x)
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/**").authenticated()
);
JPA 包重命名
javax.persistence
jakarta.persistence
CI 设置(GitHub Actions)
- name: Setup JDK
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
典型需要检查的组件
- 控制器
WebClient/ Feign 客户端- Kafka / RabbitMQ 集成
- Flyway / Liquibase 迁移
- 完整的数据库工作流
常见错误及修复
| 错误 | 修复 |
|---|---|
ClassNotFoundException: javax.* | 将导入替换为 jakarta.* |
| Spring Security 无法工作 | 将安全配置改写为新的 DSL |
| Swagger UI 加载失败 | 从 Springfox 切换到 springdoc‑openapi |
| 启动时出现反射警告 | 添加 --add-opens 标志或升级有问题的库 |
升级检查清单
- Java 8 → 11
- 修复已移除的 Java EE 模块
- Java 11 → 17
- 将 CI 流水线更新为使用 JDK 17
- 升级 Spring Boot 2.1 → 2.7
- 移除已废弃的 Spring API
- 升级 Spring Boot 2.7 → 3.x
- 将
javax.*包迁移到jakarta.* - 更新 Spring Security 配置
- 用 springdoc‑openapi 替换 Springfox
- 更新 Hibernate / JPA 依赖
- 运行完整的集成测试
遵循这种分阶段的方法——先从 Java 8 → 11 开始,提前修复已废弃的 API,并进行充分测试——将使升级到 Java 17 和 Spring Boot 3.x 过程平稳且风险低。