1、借助于开源的自动化代码重构工具OpenRewrite,快速地进行代码重构等
2、相关坐标升级更改
3、配置文件属性更改
4、打包、构建与运行验证
<revision>5.9.0-SNAPSHOT</revision>
更改后:
<revision>5.9.0.1-boot3-SNAPSHOT</revision>
对原项目代码进行重构,快捷升级可以使用OpenRewrite插件对项目进行改写,能自动升级如下:
* javax 写法自动转为 jakarta
* 部分旧包pom坐标自动更新为新版pom坐标
* 部分配置旧版自动更新新版本
* 自动增加新版自动装配文件
* 部分spring写法变更会自动更换(部分复杂的会有一定的问题,需要对部分代码进行手动重写)
需注意的几个问题:
相关流程
1、原项目可编译运行的情况下
2、引入OpenRewrite插件依赖相关执行后
3、升级jdk、Maven、boot相关版本
重要:
使用插件前要保证原项目没有经过更改,以及改过相关依赖坐标等。保证原本可编译过。
需要注意的点是该插件会对文件夹内所有文件都进行重构,不是根据具体的pom配置的module限制。所以会需要占用很大的内存,如果未设置jvm大小,一般在比较多模块的情况下会OOM。此时需要用命令设置,在项目根目录设置即可:
set MAVEN_OPTS=-Xmx2048m -XX:MaxHeapSize=1024m
<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>
1、引入坐标后使用如下命令进行预览更改,不修改实际源代码
mvn rewrite:dryRun
2、执行变更,实际应用并修改源代码
mvn rewrite:run
3、举例
例1:
mvn rewrite:dryRun
mvn rewrite:run
Generated new file:
xxx/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
Spring Boot 3.x 之后的变更之一,新的自动配置机制要求把 AutoConfiguration 类明确定义在 imports 文件中,取代了 spring.factories
文件中的配置方式
Changes have been made to:xxx/src/main/java/com/xxx/config/XxxConfigLoaderAutoConfiguration.java
例2 :如运行 mvn rewrite:run
,会把包名以 javax
开头的需要相应地变更为jakarta
,对应的单元测试、坐标等也会相应的进行变更
<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>
<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.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<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>
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>
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
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
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。