当前位置: 首页 > 后端技术 > Java

SpringBoot3.0升级记录

时间:2023-04-01 13:17:26 Java

SpringBoot在Java后端开发中经常用到。它于2022年11月24日正式发布了3.0.0版本,带来了新功能、升级依赖甚至Java版本。同时也弃用或更改了一些旧版本的写法,导致需要修改代码或配置文件。笔者尝试升级SpringBoot3.0。本文将简要总结笔者在升级时需要进行的操作、问题及解决方法,希望对读者有所帮助。版本信息用作参考。笔者升级后版本信息如下:SpringBoot3.0.0Spring6.0.2SpringSecurity6.0.0SpringDataJPA3.0.0Java17Gradle7.6确认可以通过Gradle插件确定依赖Spring框架的版本io.spring.dependency-management用于自动管理,升级SpringBoot版本时,Spring框架和Spring生态全家桶会一起升级。建议安装并依赖SpringBootPropertiesMigrator,检查是否有废弃的SpringBoot配置文件属性,可以在build.gradle文件中的dependencies闭包中添加:implementation'org.springframework.boot:spring-boot-properties-migrator'升级完成后,可以去掉这个依赖。无需升级MySQLJDBC驱动程序(可选)。2022年10月改了MySQLJDBC驱动的名称,虽然不改也可以继续使用,但是还是建议顺带改一下。在build.gradledependencies文件中,将mysql:mysql-connector-java改为com.mysql:mysql-connector-j,例如:runtimeOnly'com.mysql:mysql-connector-j'升级到2.7,保证顺利升级,不要急,一步直接升级到3.0。建议将SpringBoot升级到2.7版本,确认2.x时代的兼容性。截至发稿,最新版本为2.7.6。可以在build.gradle中的plugins闭包中使用org.springframework.boot版本改为2.7.6,例如:plugins{id'org.springframework.boot'version'2.7.6'id'io.spring.dependency-management'version'1.1.0'id'java'}buildand启动服务器,确认没有问题后,就可以关闭服务器,进行下一步的升级了。升级Java版本从SpringBoot3.0开始,最低支持Java版本为Java17,最高支持Java19。如果你还在使用Java8或Java11,需要先升级Java。推荐使用Java17的LTS版本,这里可以下载Oracle官方的JDK,也可以使用EclipseTemurin等第三方构建OpenJDK,也可以使用Docker镜像openjdk:17.0.2。如果你使用的是IntelliJIDEA,可以在文件-项目结构-平台设置-SDK中点击+自动下载JDK,下载后在项目设置-项目中更改SDK和语言级别。如果您不确定自己的代码能否在更高版本的Java中正常运行,可以使用[EclipseMigrationToolkitforJava(EMT4J)](https://github.com/adoptium/e...)等工具检查是否有不兼容高版本的写法。升级Gradle版本更高版本的Java也需要更高版本的Gradle来构建。为了构建成功,Gradle版本也需要升级。对应的最低支持版本如下:JavaGradle177.3187.5197.6比如上一步安装了Java17,这一步可以选择Gradle7.3.3、7.4.2、7.5.1、7.6等版本。如果没有特殊要求,建议一步到位选择最新版本(在release页面可以找到)。截至发稿时最新版本为7.6。如果你使用的是GradleWrapper,可以直接修改gradle/wrapper/gradle-wrapper.properties中的distributionUrl,例如:distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip后升级完成,使用Java17或Java19搭建并启动SpringBoot2.7服务器。如果没有问题,您可以关闭它并继续下一步。升级到3.0与升级到2.7类似。修改build.gradle中的插件版本即可。截至发稿,最新版本为3.0.0(最新版本可在发布页面查询),例如:plugins{id'org.springframework.boot'version'3.0.0'id'io.spring.dependency-management'version'1.1.0'id'java'}迁移到JakartaEE从SpringBoot3.0开始,原来的JavaEE被完全弃用,取而代之的是JakartaEE,也就是说所有对名为javax.*的包的引用都需要替换成jakarta.*。如果你使用的是IntelliJIDEA,可以点击Refactor-MigratePackagesandClasses-JavaEEtoJakartaEE自动完成扫描迁移。此时,您可以尝试构建并启动服务器。如果可以启动成功,则恭喜SpringBoot3.0升级成功。如果您无法正常构建或启动,您还需要继续阅读故障排除。构建故障排除以下是作者遇到的一些会导致构建失败的问题。gRPC找不到javax.annotation.Generated。如果使用gRPC,会根据proto文件生成一些Java文件。生成的Java文件会有@javax.annotation.Generated注解,上面提到的SpringBoot3.0已经完全替代了JakartaEE,如果你还需要使用JavaEE类,你必须自己手动引入依赖。根据build.gradle文件中引入的依赖,需要添加:implementation'javax.annotation:javax.annotation-api:1.3.2'SpringSecuritySpringSecurity6.0也是一次重大升级,单独这部分即可写成文章。本文简要讨论了最关键的变化。找不到类org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter。几乎每个人都会使用WebSecurityConfigurerAdapter来进行删除。原来继承this的类现在不需要再继承任何类了,只需要带上@Configuration注解即可。原本配置WebSecurity和HttpSecurity的configure方法变成了普通的@Bean方法,分别返回WebSecurityCustomizer和SecurityFilterChain。原来的方法authorizeRequests变成了authorizeHttpRequests,方法antMatchers变成了requestMatchers。示例修改自SpringSecurity官方博客://之前写的@ConfigurationpublicclassSecurityConfigurationextendsWebSecurityConfigurerAdapter{@Overridepublicvoidconfigure(WebSecurityweb){web.ignoring().antMatchers("/ignore1","/ignore2");}@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{http.authorizeRequests().anyRequest().authenticated().and().httpBasic(withDefaults());}}//当前写法@Configuration//没有继承自WebSecurityConfigurerAdapterpublicclassSecurityConfiguration{@BeanpublicWebSecurityCustomizerwebSecurityCustomizer(){//WebSecurityCustomizer是一个类似于Consumer的接口,该函数接受一个WebSecurity类型的变量,没有返回值value//这里使用lambda实现WebSecurityCustomizer接口,web变量的类型为WebSecurity,可以在箭头后面操作//使用requestMatchers()代替antMatchers()return(web)->web.ignoring()。requestMatchers("/ignore1","/ignore2");}@BeanpublicSecurityFilterChainfilterChain(HttpSecurityhttp)throwsException{http//使用authorizeHttpRequests()代替authorizeRequests().authorizeHttpRequests((authz)->authz//这种写法叫做LambdaDSL,代替原来的and()链操作.anyRequest().authenticated()).httpBasic(withDefaults());//需要build(),返回SecurityFilterChainreturnhttp.build();}}排错操作下面是笔者遇到了一些会导致服务器无法启动的问题SpringDataJPA找不到类org.hibernate.dialect.MySQL5InnoDBDialect一般用于spring.jpa.properties.hibernate.dialect,如果你用的是MySQL,请改成org.hibernate.dialect.MySQLDialect,例如:org.hibernate.dialect.MySQL5InnoDBDialect=org.hibernate.dialect.MySQLDialect找不到类org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy一般用于spring.jpa.hibernate.naming.physical-strategy,如果需要转换驼峰对于下划线,请改成org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy,例如:spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy参考链接SpringBoot3.0.0-GitHubReleaseSpringBoot3.0发行说明SpringBoot3.0迁移指南SpringSecuritywithouttheWebSecurityConfigurerAdapterGradleCompatibilityMatrix