掘金 后端 ( ) • 2024-06-22 14:09

theme: scrolls-light

朝为田舍郎,暮登天子堂。

1 前言

目前 springboot 的版本已经升级到了 3.3.0,对应的java版本也到了 jdk17,因为公司技术架构升级,需要将所有运行项目进行升级,以适应云原生架构,这算是一项挑战性的任务。公司项目大部分都是基于 jdk1.8springboot 的版本比较陈旧,在这个过程中积累了一些升级的经验,在这里写出来分享给大家。

2 项目概述

公司项目采用的是微服务的技术架构,采用的技术栈为 springcloud alibabanacosapolloredismybatis-plusrabbitmq 等。项目升级的困难点在于:

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>

项目中的主要依赖内容如下所示:

1718291474773.png

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 单元测试等。

52433.png

2 配置文件

Springboot2.4 之后的版本对配置文件的加载进行了重构,bootstrap 文件默认不会进行加载,所以无法识别 bootstrap.yml 文件,因此项目中的文件都要采用 application.yml(properties)才能正常使用。

3 自动装配机制

如果引入外部的 jar 包,自动装配机制已经不再使用 spring.factories 文件, 需要按照以下方式进行读取:

自动装配文件需要放置在 resources 文件下:
/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

除此之外,还需要在启动类上加上 @Import 注解,配置文件中的自动装配的方式需要按照行模式来配置,如下图所示:

1718898587048.png

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 中也有相应的升级插件,方便项目的升级。

20240620224350.png

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,下图是主要替换的内容:

1718951721460.jpg

5 总结

在本文中主要介绍了微服务架构升级过程中所遇到的问题,以及升级所需要的版本和注意事项,主要还是依赖的版本、包路径的变化、配置文件的变化和注解的使用变化。希望对大家升级 springcloudjdk17 项目有所帮助。