🚀 将您的遗留 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 规则

升级路径

阶段从 → 到
1Java 8 → Java 11
2Spring Boot 2.1 → 2.7
3Java 11 → Java 17
4Spring 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-opens JVM 参数
  • 用现代客户端(如 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 过程平稳且风险低。

Back to Blog

相关文章

阅读更多 »