当前位置: 首页 > news >正文

代码自动化重构工具OpenRewrite介绍

OpenRewrite 是一个用于大规模自动化代码重构的开源框架,它极大地提升了开发人员的研发效率,通过自动化地进行代码重构和转换,帮助开发人员消除代码库中的技术债务。

通过 LST、访问器和配方的结合,OpenRewrite 能够实现准确的代码转换和搜索,并支持灵活的配方开发和集成。无论是预定义的配方还是自定义的配方,都能够满足不同的项目需求,帮助开发人员更好地管理代码库中的技术债务。

OpenRewrite 支持多种编程语言,包括 Java、YAML、XML、Properties 和其他格式,可以与现代构建和持续集成工具集成。

OpenRewrite 基本概述

  • 定义:OpenRewrite 是一个用于源代码的自动重构工具,它通过提供一套自动化的解决方案,帮助开发人员改善代码的可读性、可维护性和性能。
  • 目的:OpenRewrite 的主要目的是减少手动修改代码的工作量,并确保代码的一致性和质量。
  • 应用场景:OpenRewrite 的主要用途包括但不限于自动化代码重构、框架迁移、安全漏洞修复以及代码技术债务的消除等。

OpenRewrite 的主要功能:

  1. 自动化重构: OpenRewrite 通过其配方可以进行大规模代码修改,这些配方能够处理诸如依赖升级、代码迁移、模式应用等任务。

  2. 自定义配方: 开发者可以编写自己的配方来满足特定的重构需要。

  3. IDE 集成: 它可以集成到常见的集成开发环境(如 IntelliJ IDEA 和 VS Code)中,这样开发者就能在他们熟悉的环境中应用配方。

  4. 构建工具集成: OpenRewrite 可以集成到 Maven 和 Gradle 等构建工具中,允许在构建过程中自动应用重构。

  5. 多语言支持: 尽管主要关注 Java,OpenRewrite 还为其他语言和格式提供了支持。

  6. 可扩展性: OpenRewrite 设计为可扩展,支持创建新的访问者和配方,以处理特定于语言的或者定制的重构要求。

核心特性

  1. 无损语义树(Lossless Semantic Trees, LST)

    • LST 是 OpenRewrite 中用于表示源代码的一种数据结构,它是一种抽象语法树(AST)的变体。
    • LST 保留了源代码中的类型信息和格式,使得在进行代码转换时能够保持原始代码的格式和风格,提高转换的准确性和可靠性。
  2. 访问器(Visitors)

    • 访问器是 OpenRewrite 中的核心组件,用于遍历和修改 LST。
    • 访问器定义了在遍历 LST 时要执行的操作,如查找特定类型的代码元素、修改代码元素的属性或结构等。
  3. 配方(Recipes)

    • 配方是一组预定义的或自定义的访问器,它们定义了对 LST 进行的具体修改操作。
    • 配方可以针对常见的框架迁移、安全修复和风格一致性任务进行预打包,也可以根据特定需求进行自定义开发。

工作原理

OpenRewrite 的工作原理主要包括以下几个步骤:

  1. 解析源代码:将源代码文件解析为 LST 表示形式。
  2. 遍历和修改 LST:使用访问器遍历 LST,并根据配方中定义的规则进行修改操作。
  3. 重新生成源代码:将修改后的 LST 重新生成为源代码文件。
  4. 审查和提交更改:开发人员可以审查代码中的更改,并根据需要进行进一步的调整,然后提交更改后的代码。

优势与特点

  1. 高效性:OpenRewrite 能够显著减少手动修改代码的工作量,提高代码重构的效率。
  2. 准确性:通过 LST 和访问器的结合,OpenRewrite 能够进行准确的代码转换和搜索。
  3. 灵活性:支持预定义的配方和自定义的配方开发,满足不同的项目需求。
  4. 集成性:OpenRewrite 提供了 Maven 插件等构建工具插件,方便与现有的构建流程集成。

使用方式

要使用 OpenRewrite,通常需要:

  1. 选择或创建配方: 您可以从 OpenRewrite 提供的配方库中选择现成的配方,或者根据需求创建自己的配方。

  2. 应用配方: 使用命令行工具、构建插件或 IDE 插件将配方应用到您的代码库。

  3. 查看和合并更改: 重构后,您可以查看 OpenRewrite 所做的更改并将它们合并到您的代码库中。
    OpenRewrite有多种使用方式,可以在Maven中使用 OpenRewrite,主要步骤包括:

  4. 配置 Maven 插件:在 Maven 项目的pom.xml文件中添加 OpenRewrite Maven 插件配置,并指定要运行的配方。

  5. 执行 Maven 命令:在命令行中运行 Maven 命令(如mvn rewrite:run),触发 OpenRewrite 插件执行配方。

  6. 审查和提交代码:查看代码中的更改,并根据需要进行进一步的调整,然后提交更改后的代码。

具体示例如下:

1. 添加 Maven 插件依赖

首先,需要在 Maven 项目的pom.xml文件中添加 OpenRewrite Maven 插件的依赖。以下是一个示例配置:

<build>  <plugins>  <plugin>  <groupId>org.openrewrite.maven</groupId>  <artifactId>rewrite-maven-plugin</artifactId>  <version>最新版本号</version> <!-- 请替换为最新的 OpenRewrite Maven 插件版本号 -->  <configuration>  <activeRecipes>  <!-- 指定要运行的配方列表 -->  <recipe>org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_0</recipe>  <!-- 可以添加更多配方,用逗号分隔 -->  </activeRecipes>  </configuration>  <dependencies>  <!-- 可能需要添加额外的依赖项来支持特定的配方 -->  <dependency>  <groupId>org.openrewrite.recipe</groupId>  <artifactId>rewrite-spring</artifactId>  <version>与插件兼容的版本号</version> <!-- 请替换为与插件兼容的版本号 -->  </dependency>  </dependencies>  </plugin>  </plugins>  
</build>

注意

  • 请将最新版本号替换为 OpenRewrite Maven 插件的最新版本号。
  • 如果配方需要额外的依赖项,也需要在<dependencies>部分中添加它们。

2. 运行 Maven 命令

配置好 Maven 插件后,你可以通过运行 Maven 命令来触发 OpenRewrite 插件执行配方。以下是一个示例命令:

mvn rewrite:run

这个命令会执行你在pom.xml文件中配置的配方,对 Maven 项目进行自动化重构。

3. 审查更改

OpenRewrite 执行完毕后,会生成一系列的更改。需要仔细审查这些更改,确保它们符合预期。如果一切正常,可以将这些更改提交到代码库中。

4. 额外选项

OpenRewrite Maven 插件还提供了其他选项,如dryRun模式,它允许你查看配方将执行的更改而不实际修改代码。你可以通过以下命令来运行dryRun模式:

mvn rewrite:dryRun


相关文章:

代码自动化重构工具OpenRewrite介绍

OpenRewrite 是一个用于大规模自动化代码重构的开源框架&#xff0c;它极大地提升了开发人员的研发效率&#xff0c;通过自动化地进行代码重构和转换&#xff0c;帮助开发人员消除代码库中的技术债务。 通过 LST、访问器和配方的结合&#xff0c;OpenRewrite 能够实现准确的代…...

Win11安装Docker

下载Docker Desktop for Windows 下载 下载连接&#xff1a;Install Docker Desktop on Windows | Docker Docs 地址在国外&#xff0c;需要科学上网。也可使用我提供的&#xff0c;百度网盘&#xff1a;https://pan.baidu.com/s/1232TTkkzLsoZyFjC3bmgiQ 安装 下载完成之后…...

Windows电脑如何启动RTSP服务实现本地摄像头数据共享

技术背景 提起Windows共享本地摄像头&#xff0c;好多人想到的是通过ffmepg或vlc串流到服务器&#xff0c;实际上&#xff0c;用轻量级RTSP服务更简单&#xff0c;本文就介绍下&#xff0c;如何用大牛直播SDK的Windows轻量级RTSP服务&#xff0c;采集摄像头&#xff0c;生成本…...

探索 Spring WebFlux:构建响应式 Web 应用

探索 Spring WebFlux&#xff1a;构建响应式 Web 应用 随着互联网的发展&#xff0c;传统的同步编程模型已经难以应对高并发和高吞吐量的需求。为了解决这些问题&#xff0c;响应式编程逐渐成为主流。Spring WebFlux 是 Spring 5 引入的一个响应式 Web 框架&#xff0c;它基于…...

C# 植物大战僵尸

Winform 版本开发 高效率、流畅植物大战僵尸 git地址&#xff1a;冯腾飞/植物大战僵尸...

css 作业 2

文章目录 前言第四题第五题第六题第七题第八题第九题第十题&#xff08;子标签&#xff09; 前言 昨天写了前面三次作业&#xff0c;今天把剩下的七个作业写完 第四题 http://127.0.0.1:5500/index1.html&#xff0c;就用这个网址查看代码在网页的展示效果 代码评测过不了&…...

axios在vue中的使用

文章目录 一、axios是什么&#xff1f;二、使用步骤2.1 下载2.2 引入2.3 使用Get请求Post请求Forms 三、封装 一、axios是什么&#xff1f; Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和no…...

FastAPI(七十七)实战开发《在线课程学习系统》接口开发-- 课程编辑和查看评论

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 课程编辑 先来看下课程编辑 1.判断是否登录 2.判断课程是否存在 3.是否有权限&#xff08;只有自己可以修改自己的课程&#xff09; 4.名称是否重复…...

【JavaEE初阶】线程的概念及创建

目录 &#x1f4d5; 前言 &#x1f4d5; 认识线程&#xff08;Thread&#xff09; &#x1f6a9; 概念 &#x1f60a;线程是什么 &#x1f642; 为啥要有线程 &#x1f62d; 进程和线程的区别&#xff08;面试题重点&#xff09; &#x1f92d; Java的线程和操作系统线程…...

0727,学什么学,周六就应该休息!!!!!

周六就应该休息&#xff0c;一天就忙了两小时也不是我的错喵 目录 UDP的小总结 01&#xff1a;使用select实现一个基于UDP的一对一即时聊天程序。 1.0 复读机服务器和树洞客户端 2.0 byby不了一点的敬业服务器&#xff01;&#xff01;&#xff01; 今天到此为止&#x…...

【C#】获取DICOM图像像素的像素值

8位像素深度的像素值 public byte GetGreyValue(int x, int y) {x Math.Min(x, m_nWidth - 1);y Math.Min(y, m_nHeight - 1);unsafe{byte* greyValue (byte*)m_pDicomData.ToPointer() y * m_nWidth x;return *greyValue;} } 16位像素深度的像素值 public ushort GetG…...

k8s多集群管理工具kubecm

文章目录 一、概述二、安装1、官网链接2、各平台安装2.1、MacOS2.2、Linux2.3、Windows 三、实例1、验证2、配置kubecm自动补全&#xff08;选做&#xff09;2.1、Bash2.2、Zsh2.3、fish2.4、PowerShell 3、创建存放kubeconfig文件的目录4、添加到 $HOME/.kube/config4.1、kube…...

通过 WSL 2 在Windows 上挂载 Linux 磁盘

原文查看 曾为了传输或者共享不同系统的文件频繁地在 Windows 和 Linux 系统之间切换&#xff0c;效率过低&#xff0c;所以尝试通过 WSL 2 在Windows 上挂载 Linux 磁盘。 先决条件 需要在Windows 10 2004 及更高版本&#xff08;Build 19041 及更高版本&#xff09;或 Win…...

【C#】在一个给定的宽、高范围内,获取到该多边形内部的所有坐标集合?

问题点 使用C#语言在一个给定的宽、高范围内&#xff0c;获取到该多边形内部的所有坐标集合&#xff1f; 这个多边形可能存在交叉及互相重叠部分 图像的宽、高可以定义为&#xff1a;2000*2000 多边形坐标集合&#xff1a;Point[] polygon_points new Point[] { new Point…...

json的数据结构

JSON 的数据结构 JSON 由两种数据结构组成&#xff1a;对象&#xff08;字典&#xff09;和数组。 一、对象 对象&#xff08;object&#xff09;是由键值对组成的无序集合。 键是字符串&#xff0c;值可以是任何类型&#xff0c;包括对象和数组&#xff1b;对象由一对花括…...

html-docx-js和file-saver实现html导出word

依赖html-docx-js&#xff0c;file-saver&#xff0c;html2canvas import { asBlob } from html-docx-js/dist/html-docx; import { saveAs } from file-saver; import html2Canvas from html2canvas;const handleImageToBase64 (cloneEle) > {let imgElements cloneEle.…...

三维影像系统PACS源码,图像存储与传输系统,应用于医院中管理医疗设备如CT,MR等产生的医学图像的信息系统

PACS&#xff0c;即图像存储与传输系统&#xff0c;是应用于医院中管理医疗设备如CT&#xff0c;MR等产生的医学图像的信息系统。目标是支持在医院内部所有关于图像的活动&#xff0c;集成了医疗设备&#xff0c;图像存储和分发&#xff0c;数字图像在重要诊断和会诊时的显示&a…...

Golang | Leetcode Golang题解之第292题Nim游戏

题目&#xff1a; 题解&#xff1a; func canWinNim(n int) bool {return n%4 ! 0 }...

Redis在SpringBoot中配置

lettuce redis的使用方法有两种&#xff0c;jedis和lecttuce&#xff0c;jedis用的不是很多&#xff0c;下面讲解用lettuce的使用方法。 首先导包&#xff1a; <!--redis依赖--> <dependency><groupId>org.springframework.boot</groupId><artif…...

linux 网络子系统

__netif_receive_skb_core 是 Linux 内核网络子系统中一个非常重要的函数&#xff0c;它负责将网络设备驱动层接收到的数据包传递到上层协议栈进行处理。以下是对该函数的一些关键点的详细解析&#xff1a; 一、函数作用 __netif_receive_skb_core 函数是处理接收到的网络数据…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...