spring?boot2升級(jí)spring?boot3的整體步驟流程
spring boot2升級(jí)boot3
- 整體流程如下
1、借助于開源的自動(dòng)化代碼重構(gòu)工具OpenRewrite,快速地進(jìn)行代碼重構(gòu)等
2、相關(guān)坐標(biāo)升級(jí)更改
3、配置文件屬性更改
4、打包、構(gòu)建與運(yùn)行驗(yàn)證
1. 前期準(zhǔn)備工作
第一步:確保升級(jí)之前項(xiàng)目是可編譯運(yùn)行的
第二步:更改項(xiàng)目坐標(biāo)中 version 版本,以免 install 后覆蓋了已有的包,如:
<revision>5.9.0-SNAPSHOT</revision> 更改后: <revision>5.9.0.1-boot3-SNAPSHOT</revision>
2. 使用OpenRewrite升級(jí)SpringBoot項(xiàng)目
對(duì)原項(xiàng)目代碼進(jìn)行重構(gòu),快捷升級(jí)可以使用OpenRewrite插件對(duì)項(xiàng)目進(jìn)行改寫,能自動(dòng)升級(jí)如下:
* javax 寫法自動(dòng)轉(zhuǎn)為 jakarta
* 部分舊包pom坐標(biāo)自動(dòng)更新為新版pom坐標(biāo)
* 部分配置舊版自動(dòng)更新新版本
* 自動(dòng)增加新版自動(dòng)裝配文件
* 部分spring寫法變更會(huì)自動(dòng)更換(部分復(fù)雜的會(huì)有一定的問題,需要對(duì)部分代碼進(jìn)行手動(dòng)重寫)
需注意的幾個(gè)問題:
部分自動(dòng)更新的寫法可能會(huì)有問題,上面說的復(fù)雜的寫法
部分設(shè)置的版本控制不會(huì)改變,但是如果spring定義了更高的版本,可能會(huì)導(dǎo)致版本過老不兼容,建議將spring-boot-dependecies里面定義過的版本控制進(jìn)行刪除
自動(dòng)生成后仍需手動(dòng)編譯進(jìn)行查缺補(bǔ)漏
相關(guān)流程
1、原項(xiàng)目可編譯運(yùn)行的情況下
2、引入OpenRewrite插件依賴相關(guān)執(zhí)行后
3、升級(jí)jdk、Maven、boot相關(guān)版本
2.1 添加OpenRewrite相關(guān)依賴
重要:
使用插件前要保證原項(xiàng)目沒有經(jīng)過更改,以及改過相關(guān)依賴坐標(biāo)等。保證原本可編譯過。
需要注意的點(diǎn)是該插件會(huì)對(duì)文件夾內(nèi)所有文件都進(jìn)行重構(gòu),不是根據(jù)具體的pom配置的module限制。所以會(huì)需要占用很大的內(nèi)存,如果未設(shè)置jvm大小,一般在比較多模塊的情況下會(huì)OOM。此時(shí)需要用命令設(shè)置,在項(xiàng)目根目錄設(shè)置即可:
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標(biāo)簽用于指定要執(zhí)行的OpenRewrite recipes --> <activeRecipes> <!-- 用于將SpringBoot升級(jí)到3.0版本的recipe --> <recipe>org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_3</recipe> </activeRecipes> </configuration> <dependencies> <dependency> <!-- 專門針對(duì) Spring 生態(tài)系統(tǒng)的重構(gòu)規(guī)則集合 --> <!-- 1、Spring Boot 2.x → 3.0 遷移 2、Jakarta EE 包名替換(javax → jakarta) 3、過時(shí)配置屬性更新 --> <groupId>org.openrewrite.recipe</groupId> <artifactId>rewrite-spring</artifactId> <version>6.2.1</version> </dependency> </dependencies> </plugin>
2.2 運(yùn)行OpenRewrit后檢查變更
1、引入坐標(biāo)后使用如下命令進(jìn)行預(yù)覽更改,不修改實(shí)際源代碼
mvn rewrite:dryRun
2、執(zhí)行變更,實(shí)際應(yīng)用并修改源代碼
mvn rewrite:run
這個(gè)命令會(huì)分析你的項(xiàng)目,并應(yīng)用SpringBoot 3.x.x 升級(jí) recipe,自動(dòng)更新代碼以適應(yīng)新版本的API變化
運(yùn)行后檢查:使用git查看文件變化,變化過大的需要格外注意些,如需要需進(jìn)行手動(dòng)更改
3、舉例
例1:
運(yùn)行
mvn rewrite:dryRun
運(yùn)行
mvn rewrite:run
- 生成了新的 auto-configuration imports 文件
Generated new file: xxx/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
Spring Boot 3.x 之后的變更之一,新的自動(dòng)配置機(jī)制要求把 AutoConfiguration 類明確定義在 imports 文件中,取代了 spring.factories
文件中的配置方式
- 修改了配置類
Changes have been made to:xxx/src/main/java/com/xxx/config/XxxConfigLoaderAutoConfiguration.java
例2 :如運(yùn)行 mvn rewrite:run
,會(huì)把包名以 javax
開頭的需要相應(yīng)地變更為jakarta
,對(duì)應(yīng)的單元測(cè)試、坐標(biāo)等也會(huì)相應(yīng)的進(jìn)行變更
2.3 升級(jí)相關(guān)依賴版本
- 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 以上版本,對(duì)應(yīng)的插件版本升級(jí)如下
<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> <!-- 保留方法參數(shù)名,供 Spring/SpringDoc 等框架反射使用, 不加的話endpoin會(huì)出問題--> <arg>-parameters</arg> </compilerArgs> <encoding>${project.build.sourceEncoding}</encoding> <showWarnings>true</showWarnings> <release>${java.version}</release> </configuration> </plugin>
2.4 測(cè)試
mvn compile 修改編譯問題
運(yùn)行對(duì)應(yīng)的測(cè)試類,確保升級(jí)后的項(xiàng)目仍能正常運(yùn)行。可能需要手動(dòng)調(diào)整一些OpenRewrite無(wú)法自動(dòng)處理的部分
3. 常用坐標(biāo)更改
1、MySQL JDBC驅(qū)動(dòng)
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> 變更為: <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> </dependency>
2、坐標(biāo)不變,指定對(duì)應(yīng)的版本號(hào),如:
<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、測(cè)試相關(guān)
<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 插件自動(dòng)更改代碼后,會(huì)出現(xiàn) @Configuration 和 @AutoConfiguration 同時(shí)存在的情況,需要手動(dòng)刪除 @Configuration
2、通過插件自動(dòng)更改后會(huì)出現(xiàn)pom某些包自動(dòng)指定了某些版本,建議刪除使用框架控制的版本
3、部分引入了 org.apache.commons.lang.x 的包會(huì)自動(dòng)變成 org.apache.commons.lang3.x,需要手動(dòng)改回?;蛘咭雽?duì)應(yīng)的坐標(biāo)
4、部分注解會(huì)修改錯(cuò)誤,如 javax.annotation.Nullable 會(huì)修改成 jakarta.annotation.Nullable,其實(shí)不存在 jakarta.annotation.Nullable,需要修改回去
5、部分app啟動(dòng)時(shí)會(huì)報(bào)xxx未開放,需要在啟動(dòng)增加如下參數(shù)
--add-opens java.base/java.lang.reflect=ALL-UNNAMED
總結(jié)
到此這篇關(guān)于spring boot2升級(jí)spring boot3的文章就介紹到這了,更多相關(guān)spring boot2升級(jí)boot3,spring boot 升級(jí),springboot升級(jí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Springboot之于Spring的優(yōu)勢(shì)
這篇文章主要介紹了淺談Springboot之于Spring的優(yōu)勢(shì),簡(jiǎn)述了在Java EE開發(fā)中遇到的問題,言簡(jiǎn)意賅,需要的朋友可以參考下。2017-09-09電腦上安裝多個(gè)JDK版本時(shí)該如何自由切換(詳細(xì)圖文)
我們?cè)趯W(xué)習(xí)的過程中經(jīng)常用到不同的jdk版本,那么如何在一臺(tái)電腦上同時(shí)安裝多個(gè)jdk版本并進(jìn)行切換呢,這篇文章主要給大家介紹了關(guān)于電腦上安裝多個(gè)JDK版本時(shí)該如何自由切換的相關(guān)資料,需要的朋友可以參考下2023-10-10Spring cloud Eureka注冊(cè)中心搭建的方法
這篇文章主要介紹了Spring cloud Eureka注冊(cè)中心搭建的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04Spring 中使用Quartz實(shí)現(xiàn)任務(wù)調(diào)度
這篇文章主要介紹了Spring 中使用Quartz實(shí)現(xiàn)任務(wù)調(diào)度,Spring中使用Quartz 有兩種方式,感興趣的小伙伴們可以參考一下。2017-02-02Java代理模式(Proxy)實(shí)現(xiàn)方法詳解
這篇文章主要介紹了Java代理模式(Proxy)實(shí)現(xiàn)的相關(guān)資料,代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,通過引入代理對(duì)象來控制對(duì)目標(biāo)對(duì)象的訪問,代理模式的優(yōu)點(diǎn)包括職責(zé)清晰、擴(kuò)展性好、保護(hù)目標(biāo)對(duì)象和增強(qiáng)功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04Springboot整合FreeMarker的實(shí)現(xiàn)示例
本文主要介紹了Springboot整合FreeMarker的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Java語(yǔ)言實(shí)現(xiàn)非遞歸實(shí)現(xiàn)樹的前中后序遍歷總結(jié)
今天小編就為大家分享一篇關(guān)于Java語(yǔ)言實(shí)現(xiàn)非遞歸實(shí)現(xiàn)樹的前中后序遍歷總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-01-01