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

参考

相关推荐
他҈姓҈林҈3 小时前
使用 Spring Boot 进行开发
spring boot
柏油6 小时前
MySQL InnoDB 行锁
数据库·后端·mysql
咖啡调调。6 小时前
使用Django框架表单
后端·python·django
Java&Develop6 小时前
onloyoffice历史版本功能实现,版本恢复功能,编辑器功能实现 springboot+vue2
前端·spring boot·编辑器
白泽talk6 小时前
2个小时1w字| React & Golang 全栈微服务实战
前端·后端·微服务
摆烂工程师6 小时前
全网最详细的5分钟快速申请一个国际 “edu教育邮箱” 的保姆级教程!
前端·后端·程序员
一只叫煤球的猫6 小时前
你真的会用 return 吗?—— 11个值得借鉴的 return 写法
java·后端·代码规范
Asthenia04126 小时前
HTTP调用超时与重试问题分析
后端
颇有几分姿色7 小时前
Spring Boot 读取配置文件的几种方式
java·spring boot·后端
AntBlack7 小时前
别说了别说了 ,Trae 已经在不停优化迭代了
前端·人工智能·后端