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

参考

相关推荐
编程、小哥哥33 分钟前
Java面试场景:从音视频到AI应用的技术探讨
spring boot·spring cloud·微服务·音视频·java面试·ai应用
计算机毕设定制辅导-无忧学长1 小时前
Spring Boot 与 RabbitMQ 的深度集成实践(二)
spring boot·rabbitmq·java-rabbitmq
Code哈哈笑2 小时前
【图书管理系统】用户注册系统实现详解
数据库·spring boot·后端·mybatis
用手手打人2 小时前
SpringBoot(一)--- Maven基础
spring boot·后端·maven
不会就选C.3 小时前
【开源分享】健康饮食管理系统(双端+论文)
java·spring boot·开源·毕业设计
编程、小哥哥4 小时前
Java求职者面试:从Spring Boot到微服务的技术点解析
java·spring boot·redis·微服务·spring security·高并发·面试题
Code哈哈笑4 小时前
【基于Spring Boot 的图书购买系统】深度讲解 用户注册的前后端交互,Mapper操作MySQL数据库进行用户持久化
数据库·spring boot·后端·mysql·mybatis·交互
Uranus^4 小时前
深入解析Spring Boot与Kafka集成:构建高性能消息驱动应用
spring boot·kafka·消息队列·分布式系统
Javatutouhouduan4 小时前
线上问题排查:JVM OOM问题如何排查和解决
java·jvm·数据库·后端·程序员·架构师·oom
多多*5 小时前
Spring之Bean的初始化 Bean的生命周期 全站式解析
java·开发语言·前端·数据库·后端·spring·servlet