> 技术文档 > JDK版本升级_jdk升级

JDK版本升级_jdk升级


JDK版本升级

    • 整理pom.xml文件
    • 下载安装jdk21
    • 使用mvn命令查询升级包
    • 使用EMT4J插件
      • EMT4J
        • 介绍
        • 配置EMT4J
        • 使用
    • OpenRewrite插件
      • 配置
      • 使用
    • 配置属性兼容
      • 介绍
      • 配置
    • mybatis-plus版本升级
    • 动态数据源及配置文件加密
    • Forest框架
    • 循环依赖问题
    • swagger升级OpenApi3
      • 替换依赖
      • 替换注解
        • 替换导包
        • 替换注解

整理pom.xml文件

将pom.xml文件中所有的版本号归纳到一起,方便后续升级时对所有的版本挨个处理。

下载安装jdk21

在官网中下载jdk21版本并安装

使用mvn命令查询升级包

使用命令:mvn versions:display-dependency-updates。该命令显示项目中所有依赖项的最新可用版本。执行此命令后,Maven 会扫描 pom.xml 文件,并列出当前依赖项的版本以及可用的最新版本。 输出如下:

Windows PowerShell版权所有(C) Microsoft Corporation。保留所有权利。安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindowsPS D:\\workspace\\project\\1-CRM\\CRM-master> mvn versions:display-dependency-updates[INFO] Scanning for projects...[INFO] [INFO] ------------------------------------------------------[INFO] Building CRM 1.19.0.0[INFO] --------------------------------[ jar ]---------------------------------[INFO] [INFO] --- versions-maven-plugin:2.8.1:display-dependency-updates (default-cli) @ CRM ---[INFO] The following dependencies in Dependency Management have newer versions:[INFO] antlr:antlr ........................................ 2.7.7 -> 20030911[INFO] ch.qos.logback:logback-access ......................... 1.2.6 -> 1.5.8[INFO] ch.qos.logback:logback-classic ........................ 1.2.6 -> 1.5.8[INFO] ch.qos.logback:logback-core ........................... 1.2.6 -> 1.5.8[INFO] com.atomikos:transactions-jdbc ........................ 4.0.6 -> 6.0.0[INFO] com.atomikos:transactions-jms ......................... 4.0.6 -> 6.0.0[INFO] com.atomikos:transactions-jta ......................... 4.0.6 -> 6.0.0[INFO] com.couchbase.client:java-client ...................... 3.1.7 -> 3.7.2[INFO] com.datastax.oss:java-driver-core ................... 4.11.3 -> 4.17.0[INFO] com.datastax.oss:java-driver-core-shaded ............ 4.11.3 -> 4.17.0[INFO] com.datastax.oss:java-driver-mapper-processor ....... 4.11.3 -> 4.17.0[INFO] com.datastax.oss:java-driver-mapper-runtime ......... 4.11.3 -> 4.17.0[INFO] com.datastax.oss:java-driver-metrics-micrometer ..... 4.11.3 -> 4.17.0[INFO] com.datastax.oss:java-driver-metrics-microprofile ... 4.11.3 -> 4.17.0[INFO] com.datastax.oss:java-driver-query-builder .......... 4.11.3 -> 4.17.0[INFO] com.datastax.oss:java-driver-test-infra ............. 4.11.3 -> 4.17.0[INFO] com.datastax.oss:native-protocol ...................... 1.5.0 -> 1.5.1…………[INFO] The following dependencies in Dependencies have newer versions:[INFO] cn.hutool:hutool-all ................................. 5.8.1 -> 5.8.32[INFO] com.alibaba:druid-spring-boot-starter ............... 1.1.21 -> 1.2.23[INFO] com.alibaba:easyexcel ................................. 3.3.2 -> 4.0.3[INFO] com.alibaba:fastjson ................................ 1.2.79 -> 2.0.53[INFO] com.aliyun:aliyun-java-sdk-core ....................... 4.6.1 -> 4.7.1[INFO] com.aliyun:dysmsapi20170525 .......................... 2.0.24 -> 3.0.0[INFO] com.auth0:java-jwt .................................... 3.2.0 -> 4.4.0[INFO] com.baomidou:mybatis-plus-boot-starter ................ 3.5.2 -> 3.5.8[INFO] com.baomidou:mybatis-plus-generator ................... 3.5.2 -> 3.5.8[INFO] com.bestvike:linq ..................................... 3.1.0 -> 6.0.0[INFO] com.dtflys.forest:forest-spring-boot-starter ........ 1.5.28 -> 1.5.36[INFO] com.github.oshi:oshi-core ............................. 6.4.0 -> 6.6.4[INFO] com.github.ulisesbocchio:jasypt-spring-boot-starter ... 3.0.3 -> 3.0.5[INFO] com.tencentcloudapi:tencentcloud-sdk-java .......... 3.1.934 -> 4.0.11[INFO] com.thoughtworks.xstream:xstream ..................... 1.4.4 -> 1.4.20[INFO] com.twelvemonkeys.imageio:imageio-jpeg ............... 3.8.2 -> 3.11.0[INFO] com.twelvemonkeys.imageio:imageio-pnm ................ 3.8.2 -> 3.11.0[INFO] dom4j:dom4j ................................. 1.6.1 -> 20040902.021138[INFO] io.github.lognet:grpc-spring-boot-starter ............. 3.4.1 -> 5.1.5[INFO] net.coobird:thumbnailator ............................ 0.4.8 -> 0.4.20[INFO] org.apache.ftpserver:ftpserver-core ................... 1.1.1 -> 1.2.0[INFO] org.apache.shiro:shiro-spring ......................... 1.6.0 -> 2.0.1[INFO] org.apache.tika:tika-core ........................ 1.27 -> 3.0.0-BETA2[INFO] org.apache.xmlgraphics:batik-transcoder ................. 1.14 -> 1.17[INFO] org.springframework.integration:spring-integration-mqtt ...[INFO]  5.5.7 -> 6.3.4[INFO] org.xerial:sqlite-jdbc ............................ 3.28.0 -> 3.46.1.0[INFO][INFO] The following dependencies in pluginManagement of plugins have newer versions:[INFO] org.springframework.boot:spring-boot-maven-plugin ..... 2.5.5 -> 3.3.3[INFO][INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 2.240 s[INFO] Finished at: 2024-09-19T10:10:47+08:00[INFO] ------------------------------------------------------------------------PS D:\\workspace\\project\\1-CRM\\CRM-master> 

使用EMT4J插件

EMT4J

介绍

EMT4J(Eclipse Migration Toolkit for Java)是一个致力于简化Java版本迁移过程的开源项目。它专注于处理三个长期支持(LTS)版本:Java 8、11、17和21之间的迁移。EMT4J提供了多种工具集,包括Maven插件,Java代理及命令行接口,用于分析项目代码与目标Java版本间的不兼容性。分析结果支持TXT、JSON和HTML格式输出,帮助开发团队识别并解决升级过程中的兼容问题。

配置EMT4J

pom.xml文件中添加插件配置

<plugin> <groupId>org.eclipse.emt4j</groupId> <artifactId>emt4j-maven-plugin</artifactId> <version>0.8.0</version>  <!-- --> <!-- --> <!-- process-test-classes--> <!-- --> <!-- check--> <!-- --> <!-- --> <!-- --> <configuration>  <fromVersion>8</fromVersion>  <toVersion>21</toVersion> <outputFile>report.html</outputFile> </configuration></plugin>
使用

执行命令:

mvn emt4j:check

命令执行成功后,在项目根路径下会生成一个文件report.html,使用浏览器打开可看到所有扫描到的问题,根据实际情况可对应的进行修改。

OpenRewrite插件

配置

<plugin> <groupId>org.openrewrite.maven</groupId> <artifactId>rewrite-maven-plugin</artifactId> <version>5.30.0</version> <configuration> <activeRecipes>   <recipe>org.openrewrite.java.migrate.UpgradeToJava21</recipe> </activeRecipes> </configuration> <dependencies> <dependency> <groupId>org.openrewrite.recipe</groupId> <artifactId>rewrite-migrate-java</artifactId> <version>2.13.0</version> </dependency> </dependencies></plugin>

使用

命令:

mvn rewrite:run

官网地址:Introduction to OpenRewrite | OpenRewrite by Moderne

配置属性兼容

介绍

SpringBoot3提供了一个spring-boot-properties-migrator模块,帮助更新application.propertiesapplication.yml配置文件。一旦作为依赖关系添加到你的项目中,它不仅会在启动时分析你的应用程序的环境并打印诊断结果,而且还会在运行时为你临时迁移属性。

配置

在pom.xml中添加下面的依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-properties-migrator</artifactId> <scope>runtime</scope></dependency>

**注意:**使用完成后,需要将该依赖移除。

mybatis-plus版本升级

要使用新的依赖

 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>${mybatis.plus.version}</version> </dependency>

旧的依赖会导致启动报错:

2024-09-24 19:21:49.997 ERROR ConsoleInfoBuffer - org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name \'powerMapper\' defined in file [D:\\workspace\\project\\1-CRM\\CRM-master\\target\\classes\\com\\test\\mapper\\auth\\PowerMapper.class]: Invalid value type for attribute \'factoryBeanObjectType\': java.lang.String at com.test.CRMApplication.main(CRMApplication.java:51)2024-09-24 19:25:35.507 ERROR SpringApplication - Application run failedorg.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name \'powerMapper\' defined in file [D:\\workspace\\project\\1-CRM\\CRM-master\\target\\classes\\com\\test\\mapper\\auth\\PowerMapper.class]: Invalid value type for attribute \'factoryBeanObjectType\': java.lang.Stringat org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:857) ~[spring-beans-6.1.12.jar:6.1.12]at org.springframework.beans.factory.support.AbstractBeanFactory.getType(AbstractBeanFactory.java:743) ~[spring-beans-6.1.12.jar:6.1.12]at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAnnotationOnBean(DefaultListableBeanFactory.java:735) ~[spring-beans-6.1.12.jar:6.1.12]at org.springframework.boot.sql.init.dependency.AnnotationDependsOnDatabaseInitializationDetector.detect(AnnotationDependsOnDatabaseInitializationDetector.java:36) ~[spring-boot-3.3.3.jar:3.3.3]at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.detectDependsOnInitializationBeanNames(DatabaseInitializationDependencyConfigurer.java:152) ~[spring-boot-3.3.3.jar:3.3.3]at org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor.postProcessBeanFactory(DatabaseInitializationDependencyConfigurer.java:115) ~[spring-boot-3.3.3.jar:3.3.3]at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:363) ~[spring-context-6.1.12.jar:6.1.12]at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:197) ~[spring-context-6.1.12.jar:6.1.12]at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:789) ~[spring-context-6.1.12.jar:6.1.12]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:607) ~[spring-context-6.1.12.jar:6.1.12]at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.3.3.jar:3.3.3]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) [spring-boot-3.3.3.jar:3.3.3]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) [spring-boot-3.3.3.jar:3.3.3]at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) [spring-boot-3.3.3.jar:3.3.3]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1363) [spring-boot-3.3.3.jar:3.3.3]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1352) [spring-boot-3.3.3.jar:3.3.3]at com.test.CRMApplication.main(CRMApplication.java:51) [classes/:?]

动态数据源及配置文件加密

使用dynamic-datasource

<dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot3-starter</artifactId> <version>${dynamic.datasource.version}</version> </dependency>

当第三方服务需要指定的datasource时,可通过如下方式获取

@Configurationpublic class LiquibaseConfiguration { @Resource private DataSource dataSource; /** * 用户模块Liquibase */ @Bean(name = \"springLiquibase\") public SpringLiquibase springLiquibase() { DynamicRoutingDataSource ds = (DynamicRoutingDataSource) dataSource; DataSource db1 = ds.getDataSource(DynamicDSConstant.DB1); SpringLiquibase liquibase = new SpringLiquibase(); // ……(省略) liquibase.setDataSource(db1); // ……(省略) return liquibase; }}

主要步骤:

  1. 将DataSource引入
  2. 将DataSource转为DynamicRoutingDataSource,再通过DynamicRoutingDataSource方法getDataSource(“dsName”)方法获取。

Forest框架

需要更新到支持SpringBoot3.x版本的依赖,旧的依赖会导致自动注入失败,主要原因是内部使用的包名变了。

 <dependency> <groupId>com.dtflys.forest</groupId> <artifactId>forest-spring-boot3-starter</artifactId> <version>1.5.36</version> </dependency>

循环依赖问题

启动提示:

Description:The dependencies of some of the beans in the application context form a cycle: authorizationAspect ↓ globalVariable ↓ pathFinder ↓ alarmReport ↓ alarmManager┌─────┐| threadManager↑ ↓| encryptAuthorization└─────┘Action:Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.

暂时在配置文件中添加配置,允许循环依赖。

spring: main: allow-circular-references: true

swagger升级OpenApi3

替换依赖

<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-spring-boot-starter</artifactId> <version>4.5.0</version> </dependency>

替换注解

替换导包

通过全局替换(Ctrl+Shift+F)将旧依赖引用替换,如:
import io.swagger.annotations.ApiOperation; 替换为 import io.swagger.v3.oas.annotations.Operation;

替换注解

使用结构替换可以在确保匹配的情况下最大程度保证替换的准确性

idea中的结构替换:edit-> find -> replace structurally

  1. @ApiOperation替换为@Operation

替换导包:import io.swagger.annotations.ApiOperation; 替换为 import io.swagger.v3.oas.annotations.Operation;

替换注解

@ApiOperation(value = $value$, notes = $notes$)$MethodType$ $Method$($ParameterType$ $Parameter$);@Operation(summary = $value$, description = $notes$)$MethodType$ $Method$($ParameterType$ $Parameter$);
  1. @Api替换@Tag

替换导包:import io.swagger.annotations.Api;替换为import io.swagger.v3.oas.annotations.tags.Tag;

替换注解

@Api(tags= $tag$)class $Class$ {}@Tag(name = $tag$)class $Class$ {}
  1. @ApiModel替换为@Schema

替换导包:import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;替换为import io.swagger.v3.oas.annotations.media.Schema;

替换注解:

@ApiModel(value = $value$)class $Class$ {}@Schema(title = $value$)class $Class$ {}
@ApiModelProperty(value = $value$)$FieldType$ $Field$ = $Init$;@Schema(title = $value$)$FieldType$ $Field$ = $Init$;

其他可能需要替换的注解:

  • @Api@Tag
  • @ApiIgnore@Parameter(hidden = true)@Operation(hidden = true)@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\")

需要注意的是,在上述替换中,都是固定参数个数的,如果参数个数可能不确定时,要变换一下替换模板

如下例,当存在多个入参需要全部替换时。
在这里插入图片描述
效果如下:
在这里插入图片描述

$ Parameter $ 添加 filter,count => [0, ∞],表示匹配任意数量入参的方法。
Shorten fully qualified names:使用短的全类名
Use static imports:使用静态 import 包