springboot2.7.18 升级到3.1.5过程
Spring Boot3 从 2.7.10升级到3.1.5有以下几个点需要注意。
- JDK版本支持从
JDK 17-19
版本 - javax.servlet切换到jakarta.servlet
- spring.redis配置切换为
spring.data.redis
- Spring Cloud 2022.0.4
- Spring Cloud Alibaba 2022.0.0.0
Spring Boot3 升级参考文档:
- spring boot升级参考
- spring cloud升级参考
- spring cloud alibaba升级参考
SpringBoot3版本代码示例:GitHub - jeecgboot/JeecgBoot at springboot3
查看springboot父级项目和依赖项目是否有依赖 springboot2.7.18,
若有责需要需要升级到3.1.5
相关依赖版本
<!-- 微服务 --><spring-cloud.version>2022.0.4</spring-cloud.version><spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version><alibaba.nacos.version>2.0.4</alibaba.nacos.version><xxl-job-core.version>2.4.1</xxl-job-core.version><fastjson.version>2.0.43</fastjson.version><aviator.version>5.2.6</aviator.version><pegdown.version>1.6.0</pegdown.version><commonmark.version>0.17.0</commonmark.version><knife4j-spring-boot-starter.version>4.4.0</knife4j-spring-boot-starter.version><!-- 数据库驱动 --><postgresql.version>42.2.25</postgresql.version><ojdbc6.version>11.2.0.3</ojdbc6.version><sqljdbc4.version>4.0</sqljdbc4.version><mysql-connector-java.version>8.0.27</mysql-connector-java.version><hutool.version>5.8.25</hutool.version><!-- 国产数据库驱动 --><kingbase8.version>9.0.0</kingbase8.version><dm8.version>8.1.1.49</dm8.version><!-- 积木报表--><jimureport-spring-boot-starter.version>1.9.4</jimureport-spring-boot-starter.version><!-- 持久层 --><mybatis-plus.version>3.5.3.2</mybatis-plus.version><dynamic-datasource-spring-boot-starter.version>4.1.3</dynamic-datasource-spring-boot-starter.version><druid.version>1.2.24</druid.version><commons-io.version>2.11.0</commons-io.version><commons.version>2.6</commons.version><aliyun-java-sdk-dysmsapi.version>2.1.0</aliyun-java-sdk-dysmsapi.version><aliyun.oss.version>3.17.3</aliyun.oss.version><!-- shiro --><shiro.version>1.12.0</shiro.version><java-jwt.version>3.11.0</java-jwt.version><shiro-redis.version>3.2.2</shiro-redis.version><codegenerate.version>1.4.9</codegenerate.version><autopoi-web.version>1.4.11</autopoi-web.version><minio.version>8.5.7</minio.version><justauth-spring-boot-starter.version>1.4.0</justauth-spring-boot-starter.version><dom4j.version>1.6.1</dom4j.version><qiniu-java-sdk.version>7.4.0</qiniu-java-sdk.version><jedis.version>3.8.0</jedis.version><baidu-java-sdk.version>4.16.19</baidu-java-sdk.version><!-- Log4j2爆雷漏洞 --><!-- spring boot 3 不支持下列两个版本--><!--<log4j2.version>2.17.0</log4j2.version>--><logback.version>1.4.12</logback.version>
升级activiti到8.0.0
添加activiti 指定仓库
由于7.1.0.M6以后 ,官方不再将构建制品发布到maven中央仓库了,而是发布在了alfresco仓库,这就需要我们仓库才能正确下载依赖.在pom中添加repositories标签,然后再添加repository标签。如果repositories已经有了,切不要再添加,而是将repository标签和里面的内容复制进去。最终效果如下
<repositories><repository><id>activiti-releases</id><url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases</url>
</repository>
我activiti项目中的全部依赖,含activiti
<properties><activiti.version>8.0.0</activiti.version><pagehelper.boot.version>1.4.6</pagehelper.boot.version></properties><dependencies><!-- pagehelper 分页插件 --><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelper.boot.version}</version></dependency><!--activiti--><dependency><groupId>org.activiti</groupId><artifactId>activiti-dependencies</artifactId><version>${activiti.version}</version><scope>import</scope><type>pom</type></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><version>${activiti.version}</version><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></exclusion><exclusion><artifactId>mybatis</artifactId><groupId>org.mybatis</groupId></exclusion><exclusion><artifactId>commons-io</artifactId><groupId>commons-io</groupId></exclusion><exclusion><artifactId>spring-jdbc</artifactId><groupId>org.springframework</groupId></exclusion><exclusion><artifactId>jakarta.persistence-api</artifactId><groupId>jakarta.persistence</groupId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.30</version> <!-- 根据你的Spring版本调整 --></dependency><dependency><groupId>org.jeecgframework.boot</groupId><artifactId>jeecg-system-biz</artifactId><version>3.7.3</version></dependency><!--引入微服务启动依赖 starter--><dependency><groupId>org.jeecgframework.boot</groupId><artifactId>jeecg-boot-starter3-cloud</artifactId><version>3.7.3</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><exclusions><exclusion><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version><exclusions><exclusion><artifactId>jsqlparser</artifactId><groupId>com.github.jsqlparser</groupId></exclusion><exclusion><artifactId>mybatis</artifactId><groupId>org.mybatis</groupId></exclusion><exclusion><artifactId>spring-jdbc</artifactId><groupId>org.springframework</groupId></exclusion></exclusions></dependency><!-- 引入定时任务依赖 --><dependency><groupId>org.jeecgframework.boot</groupId><artifactId>jeecg-boot-starter-job</artifactId><version>3.8.0</version></dependency><dependency><groupId>com.dameng</groupId><artifactId>Dm8JdbcDriver18</artifactId><version>8.1.1.49</version></dependency><dependency><groupId>com.dameng</groupId><artifactId>DmDialect-for-hibernate5.0</artifactId><version>8.1.1.49</version></dependency><dependency><groupId>org.jetbrains</groupId><artifactId>annotations</artifactId><version>26.0.2</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.hibernate.orm</groupId><artifactId>hibernate-core</artifactId><version>6.6.13.Final</version><exclusions><exclusion><artifactId>hibernate-commons-annotations</artifactId><groupId>org.hibernate.common</groupId></exclusion><exclusion><artifactId>jakarta.persistence-api</artifactId><groupId>jakarta.persistence</groupId></exclusion></exclusions> <!-- Spring Boot 3.1.x兼容版本 --></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-jpamodelgen</artifactId><version>6.6.13.Final</version><type>pom</type><scope>provided</scope></dependency></dependencies>
因activiti默认集成Security, SecurityConfig 需要全部放行但升级完写法也变了,注释的事boot2,下面没注释掉的是boot3的
package org.jeecg.modules.activiti.config.security;//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.security.config.annotation.web.builders.HttpSecurity;
//import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
//import org.springframework.security.core.userdetails.User;
//import org.springframework.security.core.userdetails.UserDetailsService;
//import org.springframework.security.provisioning.InMemoryUserDetailsManager;
//import org.springframework.security.web.SecurityFilterChain;
//
//@Configuration
//@EnableWebSecurity
//public class SecurityConfig extends WebSecurityConfigurerAdapter {
// @Override
// public void configure(HttpSecurity http) throws Exception {
//
// http.authorizeRequests()
// .anyRequest().permitAll().and().logout().permitAll()//配置不需要登录验证
// .and().headers().frameOptions().sameOrigin() // 解决 frame because it set 'X-Frame-Options' to 'deny'
// .and().csrf().disable() //关闭跨站请求伪造
// ;
// }
//}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// 授权配置.authorizeHttpRequests(auth -> auth.anyRequest().permitAll() // 允许所有请求)// 登出配置.logout(logout -> logout.permitAll() // 允许所有人访问登出端点)// 头部配置.headers(headers -> headers.frameOptions(frame -> frame.sameOrigin() // 允许同源iframe嵌套))// CSRF配置.csrf(csrf -> csrf.disable() // 禁用CSRF保护);return http.build();}
}
#Shiro升级说明
由于Spring Boot内部的servlet包换掉了,所以shiro需要升级,不过还好shiro官方提供了支持,以下是shiro的升级替换。
需要注意的是,spring boot 3.1.5对jedis的版本做了提升,提升后shiro无法兼容,所以只能在项目进行降版本处理。
- shiro升级参考文档 Java17和springboot3.0使用shiro报ClassNotFoundException_shiro java17-CSDN博客
<!--shiro--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring-boot-starter</artifactId><version>${shiro.version}</version><exclusions><exclusion><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId></exclusion></exclusions></dependency><!-- shiro-redis --><dependency><groupId>org.crazycake</groupId><artifactId>shiro-redis</artifactId><version>${shiro-redis.version}</version><exclusions><exclusion><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId></exclusion><exclusion><artifactId>checkstyle</artifactId><groupId>com.puppycrawl.tools</groupId></exclusion></exclusions></dependency><!-- shiro 无法使用 spring boot 3.X 自带的jedis,降版本处理 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><classifier>jakarta</classifier><version>${shiro.version}</version><!-- 排除仍使用了javax.servlet的依赖 --><exclusions><exclusion><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId></exclusion><exclusion><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId></exclusion></exclusions></dependency><!-- 引入适配jakarta的依赖包 --><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><classifier>jakarta</classifier><version>${shiro.version}</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><classifier>jakarta</classifier><version>${shiro.version}</version><exclusions><exclusion><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId></exclusion></exclusions></dependency>
#knife4j升级说明
knife4j对于spring boot 3.X版本提供了支持,不过相当于spring boot 2.X的版本来说,差异比较大,从springfox转换成了springdoc,不能做到平滑升级,以下是需要替换的注解列表.
knife4j升级参考文档:
- Knife4j版本参考 | Knife4j
- OpenAPI 3 Library for spring-boot
knife4j 2版本与3版注解变化如下:
便于大家快速升级,官方写了一个Python脚本,可以快速将整个项目升级为springdoc注解。
@Api
→@Tag
@ApiIgnore
→@Parameter(hidden = true)
or@Operation(hidden = true)
or@Hidden
@ApiImplicitParam
→@Parameter
@ApiImplicitParams
→@Parameters
@ApiModel
→@Schema
@ApiModelProperty(hidden = true)
→@Schema(accessMode = READ_ONLY)
@ApiModelProperty
→@Schema
@ApiOperation(value = "foo", notes = "bar")
→@Operation(summary = "foo", description = "bar")
@ApiParam
→@Parameter
@ApiResponse(code = 404, message = "foo")
→@ApiResponse(responseCode = "404", description = "foo")
同样在初始化文档对象上也有区别,以下前后替换
[@Bean](https://my.oschina.net/bean)public GroupedOpenApi swaggerOpenApi() {return GroupedOpenApi.builder().group("default").packagesToScan("org.jeecg").build();}[@Bean](https://my.oschina.net/bean)public OpenAPI customOpenAPI() {return new OpenAPI().info(new Info().title("JeecgBoot 后台服务API接口文档").version("1.0").contact(new Contact().name("北京国炬信息技术有限公司").url("www.jeccg.com").email("jeecgos@163.com")).description( "后台API接口").termsOfService("NO terms of service").license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0.html")));}// ---------------------------替换后---------------------[@Bean](https://my.oschina.net/bean)public GroupedOpenApi swaggerOpenApi() {return GroupedOpenApi.builder().group("default").packagesToScan("org.jeecg").build();}[@Bean](https://my.oschina.net/bean)public OpenAPI customOpenAPI() {return new OpenAPI().info(new Info().title("JeecgBoot 后台服务API接口文档").version("1.0").contact(new Contact().name("北京国炬信息技术有限公司").url("www.jeccg.com").email("jeecgos@163.com")).description( "后台API接口").termsOfService("NO terms of service").license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0.html")));}
升级的maven地址:
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.3.0</version></dependency>
在knife4j 4.X版本中,首次在对swagger文档与spring cloud gateway进行了整合,提供完整的解决方案,做到了开箱即用,以下是应用案例
<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-gateway-spring-boot-starter</artifactId><version>4.3.0</version></dependency>
#spring boot 3.x 生态平滑升级
以下为平滑升级,即更换版本即可,不需要做任何调整
<!-- druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.20</version></dependency><!-- 动态数据源 --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot3-starter</artifactId><version>4.1.3</version></dependency><!-- spring boot-admin --><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>3.0.4</version></dependency>
#META-INF升级spring.factories
新建文件 org.springframework.boot.autoconfigure.AutoConfiguration.imports
把需要自动加载的启动类一行一个全限定名就可以了 替换原来的spring.factories
升级小技巧
模块快速升级springboot3改造过程
第一步:切换项目JDK和Maven的JDK为17
第二步:替换过时类搜索javax.servlet.http.HttpServletRequest 替换为jakarta.servlet.http.HttpServletRequest
搜索javax.servlet.http.HttpServletResponse 替换为jakarta.servlet.http.HttpServletRequest
搜索javax.websocket 替换为jakarta.websocket搜索@Api替换为//@Api
搜索@AutoLowApp替换为//@AutoLowApp
搜索io.swagger.annotations.ApiModel删掉
搜索io.swagger.annotations.Api删掉
搜索javax.annotation.Resource删掉
开源删除类
搜索org.jeecg.common.constant.enums.LowAppAopEnum删掉
搜索org.jeecg.common.aspect.annotation.AutoLowApp删掉
搜索org.jeecg.common.bpm.api.IBpmBaseExtApi删掉
mvnhelp解决冲突
依赖冲突这个事情就不详细讲了,每个项目的情况都不一样,
你可以用mvnhelp解决冲突,若有依赖冲突报错再想着去Exclude掉,不用把显示的所有依赖全部去掉,那样项目可能反而起不来
Maven Helper mvn项目冲突如何解决_maven helper运行时冲突-CSDN博客