spring boot2升级boot3

  • 整体流程如下

1、借助于开源的自动化代码重构工具OpenRewrite,快速地进行代码重构等

2、相关坐标升级更改

3、配置文件属性更改

4、打包、构建与运行验证

1. 前期准备工作

  • 第一步:确保升级之前项目是可编译运行的

  • 第二步:更改项目坐标中 version 版本,以免 install 后覆盖了已有的包,如:

<revision>5.9.0-SNAPSHOT</revision>
更改后:
<revision>5.9.0.1-boot3-SNAPSHOT</revision>

2. 使用OpenRewrite升级SpringBoot项目

对原项目代码进行重构,快捷升级可以使用OpenRewrite插件对项目进行改写,能自动升级如下:

* javax 写法自动转为 jakarta
* 部分旧包pom坐标自动更新为新版pom坐标
* 部分配置旧版自动更新新版本
* 自动增加新版自动装配文件
* 部分spring写法变更会自动更换(部分复杂的会有一定的问题,需要对部分代码进行手动重写)

需注意的几个问题:

  • 部分自动更新的写法可能会有问题,上面说的复杂的写法

  • 部分设置的版本控制不会改变,但是如果spring定义了更高的版本,可能会导致版本过老不兼容,建议将spring-boot-dependecies里面定义过的版本控制进行删除

  • 自动生成后仍需手动编译进行查缺补漏

相关流程

1、原项目可编译运行的情况下
2、引入OpenRewrite插件依赖相关执行后
3、升级jdk、Maven、boot相关版本

2.1 添加OpenRewrite相关依赖

重要

使用插件前要保证原项目没有经过更改,以及改过相关依赖坐标等。保证原本可编译过。

需要注意的点是该插件会对文件夹内所有文件都进行重构,不是根据具体的pom配置的module限制。所以会需要占用很大的内存,如果未设置jvm大小,一般在比较多模块的情况下会OOM。此时需要用命令设置,在项目根目录设置即可:

set MAVEN_OPTS=-Xmx2048m -XX:MaxHeapSize=1024m
  • 目前最新的插件只支持SpringBoot_3_3,没有3.4.x的,但是相差不大,使用后注意如有springboot版本定义改为和框架同步 3.4.3
  • 在 pom.xml 中添加 OpenRewrite 插件和所需的 recipe
<plugin><groupId>org.openrewrite.maven</groupId><artifactId>rewrite-maven-plugin</artifactId><version>6.2.2</version><configuration><!-- activeRecipes标签用于指定要执行的OpenRewrite recipes --><activeRecipes><!-- 用于将SpringBoot升级到3.0版本的recipe --><recipe>org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_3</recipe></activeRecipes></configuration><dependencies><dependency><!-- 专门针对 Spring 生态系统的重构规则集合 --><!-- 1、Spring Boot 2.x → 3.0 迁移2、Jakarta EE 包名替换(javax → jakarta)3、过时配置属性更新 --><groupId>org.openrewrite.recipe</groupId><artifactId>rewrite-spring</artifactId><version>6.2.1</version></dependency></dependencies>
</plugin>

2.2 运行OpenRewrit后检查变更

1、引入坐标后使用如下命令进行预览更改,不修改实际源代码

mvn rewrite:dryRun

2、执行变更,实际应用并修改源代码

mvn rewrite:run
  • 这个命令会分析你的项目,并应用SpringBoot 3.x.x 升级 recipe,自动更新代码以适应新版本的API变化

  • 运行后检查:使用git查看文件变化,变化过大的需要格外注意些,如需要需进行手动更改

3、举例

例1

  • 运行 mvn rewrite:dryRun

  • 运行 mvn rewrite:run

  1. 生成了新的 auto-configuration imports 文件
Generated new file:
xxx/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

Spring Boot 3.x 之后的变更之一,新的自动配置机制要求把 AutoConfiguration 类明确定义在 imports 文件中,取代了 spring.factories 文件中的配置方式

  1. 修改了配置类
Changes have been made to:xxx/src/main/java/com/xxx/config/XxxConfigLoaderAutoConfiguration.java

例2 :如运行 mvn rewrite:run,会把包名以 javax开头的需要相应地变更为jakarta,对应的单元测试、坐标等也会相应的进行变更

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.3 升级相关依赖版本

  • boot2
<java.version>1.8</java.version>
<spring-framework.version>5.3.27</spring-framework.version>
<spring-boot.version>2.5.8</spring-boot.version>
<spring-cloud.version>2020.0.5</spring-cloud.version>
<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
  • boot3
<java.version>17</java.version>
<spring-framework.version>6.2.3</spring-framework.version>
<spring-boot.version>3.4.3</spring-boot.version>
<spring-cloud.version>2024.0.0</spring-cloud.version>
<spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>
  • 更新 Maven 编译器的配置
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
  • 需要使用 Maven 3.6.3 以上版本,对应的插件版本升级如下
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-plugin-plugin</artifactId><version>3.8.1</version>
</plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.1.2</version>
</plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.6.2</version><configuration><compilerArgs><!-- 保留方法参数名,供 Spring/SpringDoc 等框架反射使用,不加的话endpoin会出问题--><arg>-parameters</arg></compilerArgs><encoding>${project.build.sourceEncoding}</encoding><showWarnings>true</showWarnings><release>${java.version}</release></configuration>
</plugin>

2.4 测试

  • mvn compile 修改编译问题

  • 运行对应的测试类,确保升级后的项目仍能正常运行。可能需要手动调整一些OpenRewrite无法自动处理的部分

3. 常用坐标更改

1、MySQL JDBC驱动

<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
变更为:
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId>
</dependency>

2、坐标不变,指定对应的版本号,如:

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version>
</dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-inline</artifactId><version>4.8.0</version>
</dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-jcl</artifactId><scope>provided</scope><version>1.7.25</version>
</dependency><dependency><groupId>org.apache.httpcomponents.client5</groupId><artifactId>httpclient5</artifactId><version>5.4.1</version>
</dependency><dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version>
</dependency>

3、测试相关

<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.11.4</version>
</dependency>
<dependency><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId><version>5.11.4</version>
</dependency>

4. 配置文件属性更改

1、Redis 配置

spring.redis.host: localhost
spring.redis.port: 6379
变更为:
spring.data.redis.host: localhost
spring.data.redis.port: 6379

2、RabbitMQ 配置

spring.rabbitmq.addresses: localhost:5672
spring.rabbitmq.username: guest
spring.rabbitmq.password: guest
变更为:
spring.rabbitmq.host: localhost
spring.rabbitmq.port: 5672
spring.rabbitmq.username: guest
spring.rabbitmq.password: guest

5. 常见问题汇总

1、通过 OpenRewrite 插件自动更改代码后,会出现 @Configuration 和 @AutoConfiguration 同时存在的情况,需要手动删除 @Configuration

2、通过插件自动更改后会出现pom某些包自动指定了某些版本,建议删除使用框架控制的版本

3、部分引入了 org.apache.commons.lang.x 的包会自动变成 org.apache.commons.lang3.x,需要手动改回。或者引入对应的坐标

4、部分注解会修改错误,如 javax.annotation.Nullable 会修改成 jakarta.annotation.Nullable,其实不存在 jakarta.annotation.Nullable,需要修改回去

5、部分app启动时会报xxx未开放,需要在启动增加如下参数

--add-opens java.base/java.lang.reflect=ALL-UNNAMED

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89896.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89896.shtml
英文地址,请注明出处:http://en.pswp.cn/web/89896.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac终端设置代理

在Mac上配置终端走代理&#xff0c;需设置终端&#xff08;如zsh或bash&#xff09;使用HTTP/HTTPS/SOCKS代理&#xff0c;以便命令行工具&#xff08;如curl、git、npm&#xff09;通过代理访问网络。以下是详细步骤&#xff0c;适用于macOS 10.15及以上版本。 前提条件 代理服…

VSTO Excel中打开WinForm.ShowDialog()后,如果要使用当前的wb.Application在后台操作其他Excel文件(保持隐藏状态)

在VSTO Excel中打开WinForm.ShowDialog()后&#xff0c;如果要使用当前的wb.Application在后台操作其他Excel文件&#xff08;保持隐藏状态&#xff09;&#xff0c;可以通过以下几种方式实现&#xff1a; 方法一&#xff1a;设置Application属性控制可见性 // 在WinForm中获取…

【网络安全】DDOS攻击

如果文章不足还请各位师傅批评指正&#xff01;你有没有过这种经历&#xff1a;双 11 抢券时页面卡成幻灯片&#xff0c;游戏团战突然全员掉线&#xff0c;刷视频时进度条永远转圈圈&#xff1f;除了 “网渣”&#xff0c;可能还有个更糟的原因 —— 你正被 DDoS 攻击 “堵门”…

第9天 | openGauss中一个表空间可以存储多个数据库

接着昨天继续学习openGauss,今天是第9天了。今天学习内容是o一个数据库可以存储在多个表空间中。 老规矩&#xff0c;先登陆墨天轮为我准备的实训实验室 rootmodb:~# su - omm ommmodb:~$ gsql -r作业要求 1.创建表空间newtbs1 omm# CREATE TABLESPACE newtbs1 RELATIVE LOCATI…

H3C路由器模拟PPPOE拨号

拓扑简图 效果图 PPPoE服务器端脚本 1. 基础配置 system-view sysname PPPoE-Server # 可选,设置设备名称2. 创建本地用户(认证账号)​ local-user pppuser class network # 创建网络类用户 password simple 123456 # 设置密码(PAP/CHAP共用) service-type ppp #

Github Actions Workflows 上传 Dropbox

一、注册 访问 https://www.dropbox.com/register选择 "个人" 如果想免费使用&#xff0c;一定要选择 “继续使用2GB的Dropbox Basic 套餐”&#xff0c;如下&#xff1a; 二、在 Dropbox 中 创建app 需要去注册的邮箱中验证一下邮箱.访问 https://www.dropbox.com…

生产管理系统实现生产全过程可视化

随着现代工业的不断发展&#xff0c;智能制造、数字化转型已成为企业提高竞争力的重要途径。生产管理作为企业运营的核心环节&#xff0c;直接关系到产品质量、生产效率以及成本控制。传统的生产管理方式大多依赖手工记录和经验管理&#xff0c;存在信息滞后、数据不一致、响应…

CSS实现背景色下移10px

众所周知,背景颜色是不能移动的,通常是填充满当前容器。 不过可以想想其它办法。。 🧐 利用css3的线性属性linear,在垂直方向向下推要移动的距离设成透明颜色,能在视觉上巧妙实现下移的效果。 .title {height: 20px;background: linear-gradient(to bottom,rgba(255, …

访问 gitlab 跳转 0.0.0.0

1、检查防火墙是否关闭2、检查服务器端口是否被占用3、检查服务器是否对外开放80端口&#xff08;gitlab 默认使用80端口&#xff09;以阿里云服务器为例如果没有SSH 、HTTP、HTTPS 开放&#xff0c;需要增加规则进行添加点击确定即可。

Kotlin集合与空值

我们已经学习了 Kotlin 中的空安全&#xff08;null safety&#xff09;。在本节中&#xff0c;我们将讨论如何处理集合中的空值&#xff08;null&#xff09;&#xff0c;因为集合比其他数据类型更复杂。我们还将讨论如何处理可空元素时常用的便利方法。 集合与空值 可空集合和…

nextjs编程式跳转

Next.js 中&#xff0c;你可以通过多种方式实现编程式导航&#xff08;即通过代码而非 <Link> 组件跳转页面&#xff09;。以下是完整的实现方法&#xff1a; 1. 使用 useRouter Hook&#xff08;函数组件&#xff09; 这是最常用的方法&#xff0c;适用于函数组件&#…

Git Remote命令介绍:远程仓库管理

一、Git Remote 是什么 git remote主要用于管理远程仓库&#xff0c;可以轻松地与远程仓库进行交互&#xff0c;实现代码的共享与同步 。 二、Git Remote 的作用 &#xff08;一&#xff09;连接桥梁 假设你正在参与一个大型的 Web 应用开发项目&#xff0c;团队成员分布在…

Android开发中的11种行为型设计模式深度解析

在Android应用开发中&#xff0c;设计模式是解决特定问题的可重用方案&#xff0c;其中行为型设计模式尤其重要&#xff0c;它们专注于对象之间的通信和职责分配。本文将深入解析Android开发中最常用的11种行为型设计模式&#xff0c;每个模式都配有详细的介绍和实际应用示例&a…

Python 模块未找到?这样解决“ModuleNotFoundError”

在 Python 开发中&#xff0c;遇到“ModuleNotFoundError”时&#xff0c;通常是因为 Python 解释器无法找到你尝试导入的模块。这可能是由于多种原因导致的&#xff0c;比如模块未安装、路径不正确、虚拟环境未激活等。今天&#xff0c;就让我们一起探讨如何解决“ModuleNotFo…

Numpy库,矩阵形状与维度操作

目录 一.numpy库简介与安装 numpy库的安装 二.numpy核心功能 1.矩阵处理 2.数学运算 三.数据的维度与属性 1.维度管理 2.属性方法 四.数据类型与存储范围 五.矩阵形状与维度操作 六.数据升维与reshape()方法 一.numpy库简介与安装 NumPy是Python中用于科学计算的核心…

图论(2):最短路

最短路一、模板1. Floyd2. 01BFS3. SPFA4. Dijkstra&#xff08;弱化版&#xff09;5. Dijkstra&#xff08;优化版&#xff09;二、例题1. Floyd1.1 传送门1.2 无向图最小环1.3 灾后重建1.4 飞猪2. 01BFS2.1 Kathiresan2.2 障碍路线2.3 奇妙的棋盘3. SPFA3.1 奶牛派对3.2 营救…

“融合进化,智领未来”电科金仓引领数字化转型新纪元

一、融合进化 智领未来电科金仓2025产品发布会重磅开启&#xff01; 7月15日&#xff0c;以“融合进化 智领未来”为主题的电科金仓2025产品发布会在北京举办。产品发布会上展示了四款代表未来数字化趋势的创新性产品。这些产品不仅涵盖了数据库技术&#xff0c;还涉及到数据集…

常规笔记本和加固笔记本的区别

在现代科技产品中&#xff0c;笔记本电脑因其便携性和功能性被广泛应用。根据使用场景和需求的不同&#xff0c;笔记本可分为常规笔记本和加固笔记本&#xff0c;二者在多个方面存在显著区别。适用场景是区分二者的重要标志。常规笔记本主要面向普通消费者和办公人群&#xff0…

Shell 脚本编程全面学习指南

前言Shell 脚本编程是 Linux 和 Unix 系统管理、自动化任务的核心工具之一。通过 Shell 脚本&#xff0c;你可以自动化重复性操作、简化复杂流程、提高系统管理效率&#xff0c;甚至构建完整的自动化运维工具。本文将带你从基础到进阶&#xff0c;全面学习 Shell 脚本编程&…

DelayQueue延迟队列的使用

1、DelayQueue简介 DelayQueue 也是 Java 并发包&#xff08;java.util.concurrent&#xff09;中的一个特殊队列,用于在指定的延迟时间之后处理元素。 DelayQueue的一些关键特性&#xff1a; 延迟元素处理&#xff1a;只有当元素的延迟时间到期时&#xff0c;元素才能被取出…