从 Spring Boot 2 升级到 Spring Boot 3 的终极指南

ops/2025/3/1 21:54:15/

一、升级前的核心准备

1. JDK 版本升级

Spring Boot 3 强制要求 Java 17 及以上版本。若当前项目使用 Java 8 或 11,需按以下步骤操作:

  • 安装 JDK 17:从 Oracle 或 OpenJDK 官网下载,配置环境变量(如 JAVA_HOME)。
  • IDE 设置:在 IntelliJ IDEA 或 Eclipse 中修改项目 JDK 版本(示例):
    <!-- Maven 配置示例 -->
    <properties><java.version>17</java.version>
    </properties>
    

2. 依赖版本检查

Spring Boot 3 基于 Spring Framework 6 和 Jakarta EE 10,需确保所有依赖兼容:

  • Spring Cloud:建议升级至 2023.0.x 版本。
  • 数据库驱动:如 MyBatis 需升级到 3.0.3+,Hibernate 到 6.1.4+。
  • 第三方库:检查 Redis、ShardingSphere 等是否支持 Spring Boot 3(如 ShardingSphere 5.4.1+)。

二、代码迁移的核心步骤

1. Spring Boot 版本升级

修改 pom.xmlbuild.gradle

<!-- Maven 示例 -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version>  <!-- 最新稳定版 -->
</parent>

2. Jakarta EE 包名替换

所有 javax.* 包需替换为 jakarta.*,例如:

java">// 修改前
import javax.servlet.http.HttpServletRequest;
// 修改后
import jakarta.servlet.http.HttpServletRequest;

操作技巧:使用 IDE 的全局替换功能(如 IntelliJ 的 Ctrl+Shift+R)批量修改。

3. 配置属性迁移

Spring Boot 3 中部分配置项已变更:

  • Redis 配置spring.redisspring.data.redis
  • 日志格式:默认日期格式改为 ISO-8601,可通过以下配置恢复旧格式:
    logging:pattern:dateformat: "yyyy-MM-dd HH:mm:ss.SSS"
    

辅助工具:添加 spring-boot-properties-migrator 生成迁移报告:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-properties-migrator</artifactId><scope>runtime</scope>
</dependency>

4. 注解与 API 调整

  • @ConstructorBinding:不再需要类级别的注解,仅用于多构造函数的场景。
  • URL 匹配规则:默认关闭尾部斜杠匹配,需手动启用:
    java">@Configuration
    public class WebConfig implements WebMvcConfigurer {@Overridepublic void configurePathMatch(PathMatchConfigurer configurer) {configurer.setUseTrailingSlashMatch(true);  // 启用斜杠匹配}
    }
    

三、关键问题与解决方案

1. 依赖冲突

场景:启动时抛出 ClassNotFoundExceptionNoSuchMethodError
解决

  • 检查依赖树:使用 mvn dependency:tree 分析冲突。
  • 排除旧版本依赖(示例):
    <dependency><groupId>com.example</groupId><artifactId>old-library</artifactId><exclusions><exclusion><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId></exclusion></exclusions>
    </dependency>
    

2. 安全配置变更

Spring Security 6 中 SecurityContext 需显式保存:

java">@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(auth -> auth.anyRequest().authenticated()).securityContext(securityContext -> securityContext.securityContextRepository(new HttpSessionSecurityContextRepository())  // 启用 Session 存储);return http.build();
}

3. 响应式编程兼容性

若使用 WebFlux,需注意:

  • 响应头大小限制:Tomcat 需自定义配置:
    java">@Configuration
    public class ServerConfig implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {@Overridepublic void customize(TomcatServletWebServerFactory factory) {factory.addConnectorCustomizers(connector -> connector.setProperty("maxHttpResponseHeaderSize", "100000"));}
    }
    

四、升级后的验证与优化

1. 测试策略

  • 单元测试:确保所有 @SpringBootTest 测试通过。
  • 集成测试:使用 Testcontainers 验证数据库、Redis 等外部服务。
  • 性能测试:通过 JMeter 对比启动时间和内存占用(Spring Boot 3 启动速度提升约 20%)。

2. 监控与日志

  • Actuator 配置:启用健康检查与指标监控:
    management:endpoints:web:exposure:include: health,metrics
    
  • 日志聚合:集成 ELK 或 Prometheus + Grafana。

五、总结与建议

升级到 Spring Boot 3 不仅是版本迭代,更是技术栈的全面革新。通过本文的步骤,开发者可系统性解决包名替换、配置迁移、依赖冲突等核心问题。建议在升级前充分备份代码,并参考官方迁移指南。最终,你将获得更快的启动速度、更好的虚拟线程支持,以及 Jakarta EE 10 的现代化特性。


http://www.ppmy.cn/ops/162336.html

相关文章

记一次命令行启动springboot项目的问题 java -jar的问题

错误的写法 java -jar ruoyi-admin.jar -Dloader.path.\lib 正确的写法 java -Dloader.path./lib -jar ruoyi-admin.jar 或者 java -jar -Dloader.path./lib ruoyi-admin.jar -Dloader.path必须卸载 -jar ruoyi-admin.jar之前&#xff0c;其实我试过了-Dloader.path命令只要…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(11)

详解&#xff08;11&#xff09; 初始化配置解析上下文 senv environ;ngx_memzero(&conf, sizeof(ngx_conf_t));/* STUB: init array ? */conf.args ngx_array_create(pool, 10, sizeof(ngx_str_t));if (conf.args NULL) {ngx_destroy_pool(pool);return NULL;}conf.te…

Go语言学习笔记(五)

文章目录 十八、go操作MySQL、RedisMySQLRedis 十九、泛型泛型函数泛型类型泛型约束泛型特化泛型接口 二十、workspaces核心概念示例 二十一、模糊测试 十八、go操作MySQL、Redis MySQL package mainimport ("database/sql""errors""fmt"_ &qu…

关于手眼标定的数学模型及标定流程

手眼标定介绍 在手眼标定中&#xff0c;AXXB和AXYB是两种常见的数学模型&#xff0c;用于描述相机和机械臂之间的关系。 手眼标定中的两种情况&#xff1a;眼在手上&#xff08;Eye-in-Hand&#xff09;和眼在手外&#xff08;Eye-to-Hand&#xff09; 求解略有不同&#xff…

【AI+智造】在阿里云Ubuntu 24.04上部署DeepSeek R1 14B的完整方案

作者&#xff1a;Odoo技术开发/资深信息化负责人 日期&#xff1a;2025年2月28日 一、部署背景与目标 DeepSeek R1作为国产大语言模型的代表&#xff0c;凭借其强化学习驱动的推理能力&#xff0c;在复杂任务&#xff08;如数学问题、编程逻辑&#xff09;中表现优异。本地化部…

使用Docker Compose部署 MySQL8

MySQL 8 是一个功能强大的关系型数据库管理系统,而 Docker 则是一个流行的容器化平台。结合使用它们可以极大地简化 MySQL 8 的部署过程,并且确保开发环境和生产环境的一致性。 安装 Docker 和 Docker Compose 首先,确保你的机器上已经安装了 Docker 和 Docker Compose。 …

《OpenCV》——实例:答题卡识别

答题卡识别 实例内容&#xff1a; 该实例实现了一个基于计算机视觉技术的答题卡自动识别与评分系统&#xff0c;利用 OpenCV 库对答题卡图像进行处理和分析&#xff0c;最终得出答题卡的得分。 实例步骤&#xff1a; 导入必要的库 import numpy as np import cv2导入num…

1.2 Kaggle大白话:Eedi竞赛Transformer框架解决方案02-GPT_4o生成训练集缺失数据

目录 0. 本栏目竞赛汇总表1. 本文主旨2. AI工程架构3. 数据预处理模块3.1 配置数据路径和处理参数3.2 配置API参数3.3 配置输出路径 4. AI并行处理模块4.1 定义LLM客户端类4.2 定义数据处理函数4.3 定义JSON保存函数4.4 定义数据分片函数4.5 定义分片处理函数4.5 定义文件名排序…