spring boot2升級boot3

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;元素才能被取出…