使用OpenRewrite将Java自动升级到Java 21

news2025/1/12 18:09:43

使用 OpenRewrite 可以实现将Java 项目自动升级到Java 21语法。

基于Maven项目的实现步骤

步骤非常简单, 具体如下:

  1. 在pom.xml 中添加如下插件:
<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.openrewrite.maven</groupId>
        <artifactId>rewrite-maven-plugin</artifactId>
        <version>5.42.0</version>
        <configuration>
          <exportDatatables>true</exportDatatables>
          <activeRecipes>
            <recipe>org.openrewrite.java.migrate.UpgradeToJava21</recipe>
          </activeRecipes>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.openrewrite.recipe</groupId>
            <artifactId>rewrite-migrate-java</artifactId>
            <version>2.26.1</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
</project>
  1. 运行OpenRewrite 的Java升级的配方
mvn rewrite:run

运行示例

举例来看,Java 21 对于线程控制方法的写法做了升级:
以下是Java旧版的线程的写法:

    public void Java8Thread() {
        Thread thread = new Thread();
        thread.start();
        thread.suspend();
        thread.resume();
        thread.stop();
    }

在 JDK 21 中,不推荐使用Thread.suspend(),Thread.resume(), 和Thread.stop()方法,因为这些方法已经被废弃(deprecated)多年,并且存在严重的安全性和一致性问题。

升级前的代码:
在这里插入图片描述

升级后的代码:

在这里插入图片描述

OpenRewrite Java升级解密

上面示例的Java 升级到21是如何实现的呢?

其实是OpenWrite 提供的下面配方(Recipe):

  • groupId: org.openrewrite.recipe
  • artifactId: rewrite-migrate-java
  • version: 2.26.1

该配方可以在Maven 的中央库获取: https://central.sonatype.com/artifact/org.openrewrite.recipe/rewrite-migrate-java/2.26.1/jar

这个配方也是有很多子配方组成的, 具体包括:

  • 迁移到Java 17
  • 将内部版本升级到Java 21
  • 删除非法分号
  • 将Thread.resumme()、Thread.stop()和Thread.suped()替换为抛出新的UnsupportedOperationException()
  • URLConstructorsToURI
  • 采用 SequencedCollection
  • 使用Locale.of(…) 替换 new Locale(…)
  • 替换已弃用的Runtime#exec()方法
  • 升级操作/设置java java版本
  • 将插件升级到Java 21兼容版本
  • 避免在java.desktop中使用已弃用的空finalize()方法
  • 采用javax.security.auth。Subject.current()和javax.security.auth。Subject.callAs()方法`

其实这些配方的组合也不一定是完全的, 如何发现有一些没有覆盖的,也可以到GitHub获取该配方的源码之后进行改进,GitHub的地址是: https://github.com/openrewrite/rewrite-migrate-java/blob/main/src/main/resources/META-INF/rewrite/java-version-21.yml

本篇完整代码地址:

  • https://github.com/osxm/ai_ency/tree/main/openrewrite-demo


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2215351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第90届CMEF进行中,飞凌嵌入式引领智慧医疗新潮流

2024年10月12日&#xff0c;第90届中国国际医疗器械博览会 (CMEF)在深圳国际会展中心(宝安)开幕&#xff0c;来自全球各地的4000多家展商齐聚一堂&#xff0c;为全球健康产业带来探析前沿、洞见未来的医疗盛宴&#xff0c;飞凌嵌入式在13号馆D01展位隆重亮相。 飞凌嵌入式作为…

经典文献阅读之--GMMCalib(使用基于GMM的联合配准进行激光雷达传感器的外部标定)

0. 简介 现有的激光雷达标定框架主要使用迭代最近点(ICP)及其变体等非概率配准方法。由于它们的成对配准过程以及对初始化和参数化的敏感性&#xff0c;这些方法的结果存在偏差。这通常会导致校准过程中的不校准。概率配准方法通过专门模拟观测值的概率性质来弥补这些缺点。《…

上市公司社会责任报告信息数据(纳税金额、社会捐赠等) 2007-2023年

一、数据指标&#xff1a; 股票代码 统计截止日期 公告日期 所属省份 行业代码 行业名称 纳税总额 每股社会贡献值 社会捐赠额 是否经第三方机构审验 审验机构 是否参照GRI《可持续发展报告指南…

PostGIS:道路网密度分析

道路网密度是评价城市道路网是否合理的基本指标之一,用道路网密度指标来描述区域内的道路长度及平均分布情况,体现城市道路供给水平,其具有统计简单、直观、数据容易获取的优点。另外,通过对不同等级道路网密度的统计还能很好地反映出城市道路等级结构关系,对于方格形城市…

让Activity更加优雅地跳转

公众号「稀有猿诉」 原文链接 让Activity更加优雅地跳转 有过Android开发经验的小伙伴对startActivityForResult以及onActivityResult一定不陌生&#xff0c;正是这一对API让组件 的复用变成可能。今天就来学习一下如何在函数式的范式中驾驭Activity的跳转。 缘起 系…

git的基本操作 + 分支管理

一、基本操作 1. 修改文件 Git比其他的版本管理器设计得更加优秀&#xff0c;因为Git追踪并管理的是修改&#xff0c;而非文件。 修改一个文件&#xff0c;不管你是添加一行&#xff0c;或者删除一行&#xff0c;还是添加了又删除了&#xff0c;甚至你创建了一个新文件&…

《CS:GO》的标志性实验地图在 RTX GPU 神经网络中运行

研究人员让标志性的《CS:GO》地图《Dust 2》完全通过神经网络在单个 RTX 3090 GPU 上模拟运行。 虽然这些片段既令人印象深刻&#xff0c;又问题百出&#xff0c;但它们展示了生成式人工智能在模仿全 3D 游戏环境方面取得的令人敬佩的进展。 该项目的负责人之一埃洛伊-阿隆索&a…

了解CRM外贸管理软件及其应用指南

在全球化的商业环境中&#xff0c;外贸活动显得尤为重要&#xff0c;而有效地管理这些活动则成为企业取得成功的关键之一。CRM外贸管理软件作为一种专门针对外贸企业设计的客户关系管理工具&#xff0c;近年来受到越来越多国际贸易公司的青睐。其中&#xff0c;Zoho CRM作为市场…

Java项目:157 基于springboot技术的美食烹饪互动平台的设计与实现(含论文+说明文档)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本知识管理系统有管理员和用户两个角色 管理员权限操作的功能包括管理美食&#xff0c;对美食留言进行回复&#xff0c;管理美食知识信息&…

【QAMISRA】解决导入commands.json时报错问题

1、 文档目标 解决导入commands.json时报错“Could not obtain system-wide includes and defines”的问题。 2、 问题场景 客户导入commands.json时报错“Could not obtain system-wide includes and defines”。 3、软硬件环境 1、软件版本&#xff1a; QA-MISRA23.04 2、…

9.7 栅格图层符号化轮廓渲染

9.7 栅格图层符号化轮廓渲染_栅格构建轮廓-CSDN博客 目录 前言 轮廓 QGis设置为轮廓 二次开发代码实现轮廓 总结 前言 介绍栅格图层数据渲染之轮廓渲染说明&#xff1a;文章中的示例代码均来自开源项目qgis_cpp_api_apps 轮廓 以“3420C_2010_327_RGB_LATLNG.tif”数据…

UE小:UE5的Pixelstreaming在捕获画面的时候没办法显示非Viewport的Slate区域按钮的ToolTip

原始代码 首先&#xff0c;让我们看看原始代码片段&#xff1a; // Some widgets might want to provide an alternative Tooltip Handler. if (bCanSpawnNewTooltip || !NewTooltip) {TSharedPtr<SWidget> NewTooltipWidget NewTooltip ? NewTooltip->AsWidget()…

【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024

近期&#xff0c;阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM&#xff08;ACM国际多媒体会议&#xff09;是国际多媒体领域的顶级会议&#xff0c;旨在为研究人员、工程师和行业专家提供一个交流平台&#xff0c;以展示在多媒体领域的…

lstm基础知识

lstm前言 LSTM(Long short-term memory)通过刻意的设计来避免长期依赖问题&#xff0c;是一种特殊的RNN。长时间记住信息实际上是 LSTM 的默认行为&#xff0c;而不是需要努力学习的东西&#xff01; 在标准的RNN中&#xff0c;这个重复模块具有非常简单的结构&#xff0c;例…

TikTok Shop菲律宾卖家突破200万,TikTok自动批量关注、点赞、留言和私信

TikTok Shop自进军菲律宾市场以来&#xff0c;积极推动“购物娱乐”的概念&#xff0c;迅速成为当地电商领域的一股重要力量。其GMV&#xff08;商品交易总额&#xff09;和销售额在菲律宾市场占据显著份额&#xff0c;显示出强大的市场影响力和增长潜力。 相关数据显示&#…

TS中如何正确处理window类型

在Typescript项目中&#xff0c;你可能都遇到过这个错误&#xff1a; Window & typeof globalThis 类型上不存在属性 X。 快速修复方案 我们将介绍几种不同的解决方案来解决这个问题。 Window 接口是在名为 lib.dom.d.ts 的文件中全局定义的。你可以使用各种技术来更改它&a…

木材密度计的用途与试样硬度测量细节须知

木材密度计的重要性 在木材行业中&#xff0c;木材密度计是一种不可或缺的工具。它能够准确测量木材的密度&#xff0c;为木材的质量评估、分类以及加工提供关键的数据支持。 木材密度计的用途 首先&#xff0c;在木材贸易中&#xff0c;密度是决定木材价格和品质的重要因素…

排序算法详解~(更新中)

稳定性 在排序算法中&#xff0c;稳定性是一个重要的概念&#xff0c;指的是在排序过程中&#xff0c;如果两个元素的值相等&#xff0c;它们在排序后的相对位置与排序前的相对位置保持不变的特性。 稳定排序与不稳定排序 稳定排序&#xff1a;在排序时&#xff0c;相等的元素…

springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816)

一、漏洞描述 Spring框架是 Java 平台的一个开源的全栈应用程序框架和控制反转容器实现。2024年9月&#xff0c;Spring官方发布公告披露 CVE-2024-38816 Spring Framework 特定条件下目录遍历漏洞。当同时满足使用 RouterFunctions 和 FileSystemResource 来处理和提供静态文件…