Spring Boot 2.7 升级 3.2.1 踩坑指南

1,582 阅读2分钟

Spring Boot 升级 3.2.1 踩坑指南

原服务器上的 Java Spring Boot 程序内存占用很高,服务器资源紧张,考虑使用高版本 JDK 21,并使用虚拟线程等进行优化。

Spring Boot 源版本: 2.7.4

javax 系列依赖弃用

下面大致罗列了一些需要替换的依赖

import javax.validation.constraints.NotBlank;
替换为
import jakarta.validation.constraints.NotBlank;
​
import javax.validation.constraints.Pattern;
替换为
import jakarta.validation.constraints.Pattern;
​
import javax.annotation.Resource;
替换为
import jakarta.annotation.Resource;
​
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
替换为
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
​
import javax.validation.Valid;
替换为
import jakarta.validation.Valid;

邮件相关依赖替换

<dependency>
    <groupId>jakarta.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>
<!-- 替换为下面 -->
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>2.0.1</version>
</dependency>

Servlet 依赖

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>compile</scope>
</dependency>

替换为

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.0.0</version>
    <scope>compile</scope>
</dependency>

Swagger 升级

之前使用的是 Knife4j,依赖了 Springfox 3.0.0,而 Springfox 3.0.0 不再更新,需要替换为 OpenAPI 3。响应代码的注解最好替换一下

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
    <version>4.4.0</version>
</dependency>

使用到注解的情况下排除一下之前 Swagger 的依赖,要不然不好替换原来的注解

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-annotations</artifactId>
    <version>${knife4j.version}</version>
    <exclusions>
        <exclusion>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
        </exclusion>
        <exclusion>
            <artifactId>swagger-annotations</artifactId>
            <groupId>io.swagger.core.v3</groupId>
        </exclusion>
    </exclusions>
</dependency>

注解替换参考这个 示例

配置文件修改

springdoc:
  swagger-ui:
    path: /swagger-ui.html
  api-docs:
    path: /v3/api-docs
knife4j:
  enable: true
  setting:
    language: zh_cn

替换的注解

@ApiModel(value = "商品规格")
替换为
@Schema(description = "商品规格")
  
@ApiModelProperty(value = "删除状态")
  替换为
 @Schema(description = "删除状态")
  
@Api(tags = "App支付接口")
    替换为
@Tag(name = "App支付接口")
  
  
@ApiOperation(value = "添加接口")
  替换为
@Operation(summary ="添加接口")

注解到底能不能复用,没有测试过,我的做法是直接替换

第三方依赖升级

我们服务依赖的第三方依赖相对较少,基本依赖版本升级到 Spring Boot 3.2 就可以使用。

  • Spring Cloud 版本升级
<properties>
    <spring-cloud.version>2023.0.0</spring-cloud.version>
</properties>
  • Forest 升级
<properties>
    <forest-spring-boot-starter.version>1.5.35</forest-spring-boot-starter.version>
</properties>
<dependency>
    <groupId>com.dtflys.forest</groupId>
    <artifactId>forest-spring-boot3-starter</artifactId>
    <version>${forest-spring-boot-starter.version}</version>
</dependency>
  • Mica 升级
<mica.version>3.2.0</mica.version>
  • Sa-Token 升级

Stoke 升级后可能有点 API 的变动,稍微改动下就行,

<sa-token.version>1.37.0</sa-token.version>
        <dependency>
            <groupId>cn.dev33</groupId>
            <artifactId>sa-token-spring-boot3-starter</artifactId>
            <version>${sa-token.version}</version>
        </dependency>

MyBatis-Plus 升级

<mybatis-plus.version>3.5.5</mybatis-plus.version>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>

Spring Boot 配置变动

自动配置修改

Spring Boot 3.0 之后已经弃用了 spring.factories 文件配置,需要使用以下配置方式:

image-20231227091746731

目录如下,内容可以参考网上教程,这儿提一个自动生成配置的依赖:

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
<dependency>
    <groupId>net.dreamlu</groupId>
    <artifactId>mica-auto</artifactId>
    <version>3.1.2</version>
</dependency>

Redis 配置修改

spring:
  data:
    redis:
      database: 3
      host:  ${REDIS_HOST:127.0.0.1}
      port: ${REDIS_PORT:3306}
      password: ${REDIS_PASSWORD:123456}

Redis 的配置需要添加到 spring.data 之下,要不然不生效。

虚拟线程修改

spring:
  threads:
    virtual:
      enabled: true

Docker 镜像选择

可以自动打 Docker 镜像,我懒,直接找 OpenJDK,我就找了 eclipse-temurin

image-20231227092438029

# Maven 选择
maven:3.9.6-eclipse-temurin-21-alpine
# JVM 运行镜像选择
eclipse-temurin:21.0.1_12-jre

实际运行效果

未升级之前

image-20231227085110128

升级后

image-20231227085138268

因为是测试环境,晚上的运行结果,没有什么流量,单纯看效果还行,从 1.5GB 多降低到 800 多MB。