赞
踩
springBoot3官方升级文档 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide
springBoot2项目升级springBoot3记录,springBoot3支持最低JDK版本为17,所以升级时必须同步升级JDK版本。
这个官方资料里有提到,是sbt3的一个重要变化,内嵌的tomcat不再支持javax.servlet以及其他javax相关包,比如javax.annotation,现在必须换用jakarta系列规范与API了,比如jakarta.servlet与jakarta.annotation。
2017年,Oracle宣布将Java EE捐赠给Eclipse基金会,但不再允许其使用Java商标,于是社区投票后将Java EE改名为Jakarta EE。随后大家开始慢慢将javax系列包改为使用Jakarta系列的包。而到了sbt3,spring终于宣布不再支持使用老旧的javax的相关包。这意味着你不但要重构自己的java工程中对javax的使用,也要升级很多第三方提供的jar的版本。不过目前这个工作应该差不多都做过了。
这个变动看着可怕,其实对应很简单,我个人只做了以下几件事:
根据spring官方文档以及spring-boot-starter-parent的最新版本,确定各个第三方jar的较新兼容版本,如果你一直直接使用spring-boot-starter-parent作为你的sbt工程的Parent工程,那么这一步很简单,只需要注意自己显式写了版本号的jar依赖即可。如果你和我一样有自己的Parent工程,那么就需要参照官方文档和使用spring-boot-starter-parent的demo中的版本号来修改自己的Parent工程中的各个依赖包的版本号了。
使用jakarta.servlet与jakarta.annotation代替javax的对应包
jakarta.servlet
jakarta.servlet-api
jakarta.annotation
jakarta.annotation-api
使用idea提供的重构功能将javax包名改为jakarta。可以直接使用idea的菜单Refactor -> Migrate Packages and Classes -> Java EE To Jakarta EE即可。
如果你有自己写的springboot-starter,那么你一定用/META-INF/spring.favtories文件定义过发现自动配置。
但是在sbt2.7时,这个文件被弃用了,但还没有移除这个功能,在sbt3中,它被移除了。
比如以前我们需要定义/META-INF/spring.favtories文件:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
x.x.x.x.x.x,
x.x.x.x.x
那么现在你得改成/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件:
x.x.x.x.x.x
x.x.x.x.x
如果你对应过2021年12月影响巨大的log4j2安全漏洞问题,那么你可能固定使用了log4j2的2.17.x版本,这个版本在sbt3中不兼容,sbt3使用的是2.19.0版本。
放心,新版本目前没有发现安全漏洞。
你可以直接去掉自己之前对log4j版本的固定,或者手动改为2.19.0,都可以。
在log4j-slf4j-impl
版本升级到2.19.0
后,slf4j-api
的版本默认会变为2.0.x
,此时运行以前的junit,如果包含slf4j的log,那么会抛出错误:
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.
SLF4J: Ignoring binding found at [jar:file:/home/maven_repo/org/apache/logging/log4j/log4j-slf4j-impl/2.19.0/log4j-slf4j-impl-2.19.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.
将slf4j-api
版本显式声明为1.7.36
即可解决问题, 或者引入log4j-slf4j2-impl版本
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
如果你的工程使用了spring-boot-starter-data-ldap,那么现在它会在启动时自动触发ldap的健康检查,如果你想关闭它,在application配置中添加以下属性即可:
management:
health:
ldap:
# ldap健康检查开关,默认开启, 这里关闭
enabled: false
RestTemplate底层默认使用的http客户端不再是apache的httpclient了,换成了jdk自己的,从而带来一个好处:
以前想用RestTemplate访问https服务,需要自己定义sslContext信任指定证书或所有证书,并自定义一个http客户端来代替RestTemplate的默认http客户端。
但现在不需要了,直接new RestTemplate()即可访问https服务。
我不确定new RestTemplate()可以直接访问https服务这个特性是不是从sbt3开始的,但是sbt3的restTemplate已经不再支持apache的httpclient4版本了,改为支持apache的httpclient5,但apache的httpclient5和httpclient4并不兼容,因此之前基于httpclient4自定义的ssl与http客户端相关代码编译不过了。然后我在研究怎么用apache的httpclient5来定义支持ssl的http客户端时突然发现,可以直接用new RestTemplate()访问https服务了。
原来的swagger-ui依赖坐标替换为以下坐标
webMvc工程使用
webFlux工程使用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。