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

参考

相关推荐
Hello.Reader25 分钟前
深入理解 Rust 的 `Rc<T>`:实现多所有权的智能指针
开发语言·后端·rust
yoona102028 分钟前
Rust编程语言入门教程(八)所有权 Stack vs Heap
开发语言·后端·rust·区块链·学习方法
m0_748247551 小时前
springboot中配置logback-spring.xml
spring boot·spring·logback
m0_748250031 小时前
springboot使用logback自定义日志
java·spring boot·logback
程序猿熊跃晖1 小时前
多环境日志管理:使用Logback与Logstash集成实现高效日志处理
spring boot·elk·logback
考虑考虑2 小时前
MyCat2使用
java·后端·java ee
KingDol_MIni2 小时前
Spring Boot 集成 T-io 实现客户端服务器通信
java·服务器·spring boot
后端码匠2 小时前
Spring Boot3+Vue2极速整合:10分钟搭建DeepSeek AI对话系统
人工智能·spring boot·后端
可乐张2 小时前
AutoGen 技术博客系列 (九):从 v0.2 到 v0.4 的迁移指南
后端·llm
可乐张2 小时前
AutoGen 技术博客系列 (八):深入剖析 Swarm—— 智能体协作的新范式
后端·llm