这段时间有个艰巨的任务,把早期项目改造为新版本架构,涉及到JDK版本、Spring boot版本以及依赖管理架构改造。
需求
-
将依赖管理从Gradle 转换为 Maven
-
将 JDK 1.8 版本升级到 17
-
将Spring Boot 2.7.13升级到 3.5.0
计划
为了更顺畅的完成以上改造,大体做了以下计划:
步骤 | 内容 |
---|---|
1 | Gradle 转换为 Maven 构建 |
2 | 升级 JDK1.8 版本到 17 |
3 | 升级 Spring Boot 2.7.13到 3.5.0 |
4 | 源码兼容性调整 |
5 | 测试和验证 |
前置准备
- 确保项目可以正常构建并运行
- 确保项目依赖完整并已去除无用依赖
- 确认好项目的依赖各类版本
一、Gradle 转换为 Maven
依赖管理作为第一步,因为相比之下改动最小,基本不牵扯代码修改。同时,最开始切换Maven,也为之后升级过程中可能存在的依赖版本修改做准备。
1.pom转化
- 打开 IDEA,右键项目根目录 → Add Framework Support → 勾选 Maven。
- IDEA 会生成 pom.xml 文件。
- 手动迁移 build.gradle 中的依赖、插件信息。
如果使用社区版Idea:
手动创建pom并逐一将所有build.gradle转化为pom.xml。
2.移除所有gradle相关文件
- build.gradle / build.gradle.kts
- settings.gradle
- .gradle/
- gradlew、gradlew.bat
3.移除.idea目录并重启idea
4.关键步骤
在idea中右键根目录pom.xml文件选择“添加项目为maven”。
注意:
由于maven与gradle的很多写法不同,在实际加载依赖时会提示各种错误,一般需要额外注意,对指定目录依赖的引用,并注意对Lombok的编译时排除的设定。
指定目录依赖的引用
例如:
<dependency>
<groupId>com.local</groupId>
<artifactId>opencv</artifactId>
<version>453</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/opencv/opencv-453.jar</systemPath>
</dependency>
Lombok的编译时排除
例如:
<build>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
二、升级JDK
1.修改项目SDK版本
2.修改平台SDK版本
3.修改JDK版本变化带来的语法区别
一些写法上的改变,如:
- 一些废弃的写法
- 一些var类型的声明
- 依赖版本的变化
需要按需调整,不再累述。
三、Spring boot升级
相比SDK版本变化,Spring boot的升级带来的代码修改是最大的。
1.解决版本依赖问题
注意:版本的取舍很重要,哪些需要升级,哪些需要保留低版本,需要根据项目情况判断,一般以spring boot为核心的组件都应该做升级
2.解决新版本写法
例如:
javax.xml.bind → jakarta.xml.bind
3.解决缺失依赖问题
升级后,一些原有的依赖可能会被舍弃,需要手动加上,如:
zip4j 2.x
版本中,包结构已完全重构,net.lingala.zip4j.core.*
目录被移除。如果你升级了 zip4j 到 2.x,就找不到这个类。
四、代码兼容性调整
迁移过程中出现的报错和异常:
1.xml报错
自 JDK 9 开始,javax.xml.bind 所在的 JAXB(Java Architecture for XML Binding)模块被移出 JDK 默认类库,在 JDK 11 及更高版本中已彻底移除。
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
改为:
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.Marshaller;
2.升级mybitasPlus后,分页报错
page.setDesc()//不存在该方法
page.setAsc() //不存在
改为:
page.addOrder(OrderItem.desc(...))
page.addOrder(OrderItem.asc(...))
3.已经被弃用的CommonsMultipartFile
import org.springframework.web.multipart.commons.CommonsMultipartFile;
改为:
import org.springframework.web.multipart.MultipartFile;
4.已经弃用的Base64Utils
import org.springframework.util.Base64Utils;
byte[] bytes = Base64Utils.decodeFromString(pptImage);//解码
改为:
import java.util.Base64;
byte[] bytes = Base64.getDecoder().decode(pptImage);//解码
5.javax→jakarta
大部分隶属javax的类库都改为jakarta,如::
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
改为:
import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
6.mybatis字段相关修改
@TableField(strategy = FieldStrategy.IGNORED)
改为:
@TableField(insertStrategy = FieldStrategy.IGNORED, updateStrategy = FieldStrategy.IGNORED)
五、测试与验证
1.逐一build每个项目
务必使用maven重新导入所有依赖,并重新进行build操作,如果这个过程无误,则证明本次升级成功,如有问题,按需解决
2.依赖关系确认
还需确认转化后的项目的树状结构是否与之前一致,即父子关系不能变
3.运行项目
运行项目进行开发环境测试,确保模块正常
4.打包测试
打包进行测试环境测试,以确保升级后功能可正常跑通