升级到JDK17和Spring Boot 2.7.8

这几天稍微得闲,尝试把fron-zero-to-n这个项目的Spring Boot版本升级到2.7.8,JDK升级到17,为后续升级到Spring Booot 3.0做准备。

详细版本

依赖项 升级前的版本 升级后的版本
Spring Boot 2.6.2 2.7.8
Spring Cloud 2021.0.0 2021.0.5
Java 1.8 17

Spring Boot和Spring Cloud的版本对应关系,还是参考https://start.spring.io或者https://start.spring.io/actuator/info

切换JDK版本

这里简单说一下开发环境如何切换JDK。笔者没有用那些号称可以自动切换的工具,纯手工操作。

安装多个版本的JDK

为了方便切换JDK,建议用zip包直接解压的方式安装JDK,这样各种版本的JDK就可以和平相处了。

MAVEN切换JDK

在Windows上,直接修改bin下的mvn.cmd,在文件最前面上设置变量JAVA_HOME,直接指向要切换的JDK。

mvn.cmd
1
set JAVA_HOME=D:\program files\Java\jdk-17.0.2

IntelliJ IDEA切换JDK

Maven

设置Maven用JDK17运行。
菜单路径: File -> Settings... -> Build,Execution,Deployment -> Build Tools -> Maven -> Runner

Project JDK

菜单路径: File -> Project Structure... ->

升级zero和one

from-zero-to-n\zero和from-zero-to-n\one这两个文件夹下的项目,都是直接修改pom.xml里的配置,重新编译就OK了,没什么好说的。

升级from-zero-to-n\two

这个项目的升级,涉及到了代码修改。

数据库H2的升级

直接修改pom.xml里的设置之后,编译没问题,但是运行会报错。如果旧版本的H2数据库文件已经存在,则需要删除掉,应用启动时会自动创建和初始化。

Fix “… expected identifier”

解决org.h2.jdbc.JdbcSQLSyntaxErrorException: … expected identifier
auth-server里用到的实体User,JPA默认创建的表名是user,跟H2数据库里的保留字冲突了,需要给实体指定另外一个名称。

修改com.example.two.authserver.entity.User.java

1
2
3
@Entity
+ @Table(name = "d_user")
public class User implements UserDetails, Serializable ...

修改com.example.two.authserver.entity.Role.java

1
2
3
@Entity
+ @Table(name = "d_role")
public class Role implements GrantedAuthority ...
很多过时的类和注解(Deprecated)

升级走到这一步,项目可以跑起来了,但是有很多过时的类和注解,oauth2相关的全军覆没:
ClientDetailsServiceConfigurer
AuthorizationServerConfigurerAdapte
EnableAuthorizationServer
EnableResourceServer
AuthorizationServerEndpointsConfigurer
ClientDetailsService
CompositeTokenGranter
OAuth2RequestFactory
provider.TokenGranter
ClientCredentialsTokenGranter
AuthorizationCodeServices
AuthorizationCodeTokenGranter
ImplicitTokenGranter
ResourceOwnerPasswordTokenGranter
RefreshTokenGranter
AuthorizationServerTokenServices
TokenStore
JwtAccessTokenConverter
JwtTokenStore
KeyStoreKeyFactory

@EnableAuthorizationServer
@EnableResourceServer

源代码上的Deprecated注释,都指向了OAuth 2.0 Migration Guide,该迁移指南表明这次升级不是精确的一对一替换,而是用新项目Spring Authorization Server来替换旧框架Spring Security OAuth2,改动很大。

放弃迁移到Spring Authorization Server

从Spring Authorization Server的release来看,对应我们这个项目的Spring Boot 2.7.8,它的版本是0.4.0,生产环境的话风险有点大。

所以就不折腾了,1.0版本是对应的Spring Boot 3.0,到时再研究一下。