springboot 3.0项目升级实践
朝为田舍郎,暮登天子堂。
1 前言
目前 springboot
的版本已经升级到了 3.3.0
,对应的java版本也到了 jdk17
,因为公司技术架构升级,需要将所有运行项目进行升级,以适应云原生架构,这算是一项挑战性的任务。公司项目大部分都是基于 jdk1.8
,springboot
的版本比较陈旧,在这个过程中积累了一些升级的经验,在这里写出来分享给大家。
2 项目概述
公司项目采用的是微服务的技术架构,采用的技术栈为 springcloud alibaba
、nacos
、apollo
、redis
、mybatis-plus
、rabbitmq
等。项目升级的困难点在于:
1 项目所使用的依赖api发生变化,需要改动代码,多数在于声明 bean ,配置数据库和redis的参数,以及语法的变更。
2 非功能性的代码发生变化,例如单元测试的注解,swagger 的注解发生变化,servlet 包路径发生变化,这种改动不影响业务,但是改动量比较大,涉及的改动点比较多。
3 依赖之间的版本差异比较大,对于旧项目的升级,需要摸索的时间比较长。
4 项目升级后所依赖的环境发生变化,java 的语法发生了变化,在项目开发中需要注意。
3 依赖版本
接下来会将项目中所使用到的主要依赖版本罗列一下,这些都是经过调试过的依赖关系,为后续的项目改造提供便利。
-- springboot 版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.0.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
-- springcloud alibaba 版本
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0-RC2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
项目中的主要依赖内容如下所示:
4 项目升级注意事项
1 javax 升级为 jakarta
升级到jdk8以后的版本,javaEE 迁移到了 jakartaEE Api,原来的 javax 包需要修改为 jakarta。常见的操作如下所示:
import javax.servlet.* 改为:import jakarta.servlet.*
import javax.validation.* 改为 import jakarta.validation.*
import javax.annotation.* 改为 import jakarta.annotation.*
除此之外,还可以借助 idea 提供的插件工具来进行处理,Refactor>Migrate Packages and Classes
,不仅可以迁移 jakarta 还可以迁移 junit 单元测试等。
2 配置文件
Springboot2.4
之后的版本对配置文件的加载进行了重构,bootstrap
文件默认不会进行加载,所以无法识别 bootstrap.yml
文件,因此项目中的文件都要采用 application.yml(properties)
才能正常使用。
3 自动装配机制
如果引入外部的 jar 包,自动装配机制已经不再使用 spring.factories
文件, 需要按照以下方式进行读取:
自动装配文件需要放置在 resources 文件下:
/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
除此之外,还需要在启动类上加上 @Import
注解,配置文件中的自动装配的方式需要按照行模式来配置,如下图所示:
4 ORM 框架
对于 web 项目来说,orm 框架是必不可少的存在,通常是使用 mybatis 或者 mybatisplus, 对于数据库驱动和mybatis的依赖如下所示,配置文件如下所示:
-- 数据库驱动依赖
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.1.0</version>
</dependency>
-- mybatis-plus 依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.6</version>
</dependency>
-- mybatis-plus 多数据源配置
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>
在 application.properties
中的 mybatis-plus
的连接配置没有多大的变化,使用 @DS
可以实现数据源的动态切换。
5 swagger
在 springboot3
中集成 swagger3
的方式已经发生了变化,需要引入如下依赖:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.2.0</version>
</dependency>
在代码中需要加入以下的配置即可使用 swagger:
@Bean
public OpenAPI openAPI() {
return new OpenAPI()
.info(new Info()
.title("srpingboot3 集成 swagger")
.description("项目文档")
.version("v1"))
.externalDocs(new ExternalDocumentation()
.description("API文档")
.url("/"));
}
如下图所示,swagger 的注解使用发生了很大的变化,需要按照如下的映射关系进行替换,在 idea 中也有相应的升级插件,方便项目的升级。
6 单元测试
在 springboot3.0
中,单元测试的用法发生了变化,主要就是 junit4
升级到了 junit5
,同样可以 idea
的迁移工具来实现单元测试的代码升级。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
主要迁移内容就是常用的注解,从 org.junit
升级到了 org.junit.jupiter.api
,下图是主要替换的内容:
5 总结
在本文中主要介绍了微服务架构升级过程中所遇到的问题,以及升级所需要的版本和注意事项,主要还是依赖的版本、包路径的变化、配置文件的变化和注解的使用变化。希望对大家升级 springcloud
和 jdk17
项目有所帮助。
转载自:https://juejin.cn/post/7382891974943277082