spring boot 2.x升级到3.x需要做哪些改动?让我一步一步带大家实践

大家好,这里是小奏 ,觉得文章不错可以关注公众号小奏技术

背景

最近有一些项目想升级升级项目的spring boot到3.x相关的版本,所以我这边的公共sdk项目需要进行spring boot 3.x相关的支持,所以打算踩坑试试

升级

spring boot官方有一份升级文档,升级前可以大致过一遍Spring-Boot-3.0-Migration-Guide

jdk升级

都知道spring boot 3.x需要的最低版本是jdk17,所以首先修改jdk版本

  1. 修改maven jdk compile配置
xml 复制代码
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.10.1</version>
    <configuration>
        <source>17</source>
        <target>17</target>
    </configuration>
</plugin>

sourcetarget都改成17

  1. 修改properties中maven jdk版本
xml 复制代码
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>

spring boot依赖升级

这里直接修改dependencyManagement中的版本控制

xml 复制代码
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>3.4.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

启动

升级完成后直接启动看报错,然后根据报错信息一个一个解决

javax.servlet:javax.servlet-api迁移

启动直接编译报错

javax.servlet:javax.servlet-api相关的依赖全部迁移到jakarta.servlet:jakarta.servlet-api

所以一些类需要修改包路径,全局替换即可。这里列举我遇到的一些类

  • import javax.servlet.http.HttpServletRequest; -> import jakarta.servlet.http.HttpServletRequest;
  • import javax.servlet.http.HttpServletResponse; -> import jakarta.servlet.http.HttpServletResponse;
  • import javax.servlet.http.HttpSession; -> import jakarta.servlet.http.HttpSession;
  • import javax.servlet.http.Cookie; -> import jakarta.servlet.http.Cookie;
  • import javax.annotation.PostConstruct; -> import jakarta.annotation.PostConstruct;

LocalVariableTableParameterNameDiscoverer删除

Spring Framework 6 和 Spring Boot 3.0 对字节码解析和参数名称发现机制进行了重构。为了替代 LocalVariableTableParameterNameDiscoverer,可以使用 DefaultParameterNameDiscoverer,它结合了多种参数名称发现策略(如 ASM、Kotlin 反射等)

所以使用LocalVariableTableParameterNameDiscoverer的地方需要替换成DefaultParameterNameDiscoverer

java.lang.NoClassDefFoundError: com/google/gson/Strictness

遇到这个问题手动添加gson依赖即可解决问题,这个问题是使用spring boot 3.6.0遇到的问题

xml 复制代码
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.11.0</version>
            </dependency>

参考

mybatis plus升级

mybatis plus spring boot 3.x的依赖artifactId也变了,所以最好全局替换一下

mybatis-plus-boot-starter替换为mybatis-plus-spring-boot3-starter

完整坐标

xml 复制代码
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
            <version>3.5.9</version>
        </dependency>

mybatis plus 3.x不支持 dao.list(null),编译会报错,也需要修改成dao.list()

手动引入依赖mybatis-spring-boot-autoconfigure

注意mybaits plus没有自动引入mybatis-spring-boot-autoconfigure依赖没如果不手动引入会报错

java 复制代码
java.lang.IllegalArgumentException: Could not find class [org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration]
        at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:341) ~[spring-core-6.0.21.jar:6.0.21]
xml 复制代码
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-autoconfigure</artifactId>
                <version>3.0.4</version>
            </dependency>

pagehelper 不支持3.x版本需要排除掉pagehelper中mybatis相关依赖

如果使用了pagehelper分页插件,先手动排查掉pagehelper中的mybatis相关依赖

相关讨论参考issues:github.com/pagehelper/...

xml 复制代码
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>2.1.0</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.mybatis</groupId>
                        <artifactId>mybatis</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.mybatis</groupId>
                        <artifactId>mybatis-spring</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>org.mybatis.spring.boot</groupId>
                        <artifactId>mybatis-spring-boot-starter</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

bean注入异常

spring boot 3.x删除了原先src/main/resources/META-INF/spring.factories自动装配方式,改成了src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports自动装配方式

所以如果使用了spring.factories自动装配方式,需要改成AutoConfiguration.imports方式

比如原先是这样

  • src/main/resources/META-INF/spring.factories
ini 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.nebula.web.boot.error.NebulaRestExceptionHandler,\
  com.nebula.web.boot.config.BaseWebMvcConfig

修改后很简单

  • src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
lua 复制代码
com.nebula.web.boot.error.NebulaRestExceptionHandler
com.nebula.web.boot.config.BaseWebMvcConfig

spring cloud 版本升级适配

如果使用了spring cloud,spring cloud相关版本也要进行升级适配spring boot版本,这里给一个官方推荐的版本

我这里直接升级到spring cloud 2024.0.0版本

xml 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2024.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

总结

总的来说升级起来还是有一些小坑,一些冷门维护不频繁的三方sdk可能暂不支持spring boot 3.x,需要自己考虑如何绕开或者手动二开

其他的主要还是对一些三方sdk做适配性升级,比如mybatis plus

参考

相关推荐
多多*31 分钟前
线程池相关 FutureTask介绍 处理阻塞 Future改进->CompletableFuture
java·开发语言·后端·python·spring
Quantum&Coder1 小时前
Swift语言的软件工程
开发语言·后端·golang
兩尛3 小时前
项目概述、开发环境搭建(day01)
java·spring boot·web
吴代庄3 小时前
复盘成长——2024年终总结
后端
CyberScriptor3 小时前
CSS语言的语法糖
开发语言·后端·golang
武昌库里写JAVA7 小时前
React方向:react中5种Dom的操作方式
java·开发语言·spring boot·学习·课程设计
前鼻音太阳熊8 小时前
【Spring Boot 应用开发】-02 主要特性
spring boot
WeeJot嵌入式8 小时前
【C语言】标准IO
c语言·后端
Hello Dam8 小时前
基于 FastExcel 与消息队列高效生成及导入机构用户数据
java·数据库·spring boot·excel·easyexcel·fastexcel
hnmpf9 小时前
flask_sqlalchemy relationship 子表排序
后端·python·flask