代码自动化重构工具OpenRewrite介绍
OpenRewrite 是一个用于大规模自动化代码重构的开源框架,它极大地提升了开发人员的研发效率,通过自动化地进行代码重构和转换,帮助开发人员消除代码库中的技术债务。
通过 LST、访问器和配方的结合,OpenRewrite 能够实现准确的代码转换和搜索,并支持灵活的配方开发和集成。无论是预定义的配方还是自定义的配方,都能够满足不同的项目需求,帮助开发人员更好地管理代码库中的技术债务。
OpenRewrite 支持多种编程语言,包括 Java、YAML、XML、Properties 和其他格式,可以与现代构建和持续集成工具集成。
OpenRewrite 基本概述
- 定义:OpenRewrite 是一个用于源代码的自动重构工具,它通过提供一套自动化的解决方案,帮助开发人员改善代码的可读性、可维护性和性能。
- 目的:OpenRewrite 的主要目的是减少手动修改代码的工作量,并确保代码的一致性和质量。
- 应用场景:OpenRewrite 的主要用途包括但不限于自动化代码重构、框架迁移、安全漏洞修复以及代码技术债务的消除等。
OpenRewrite 的主要功能:
-
自动化重构: OpenRewrite 通过其配方可以进行大规模代码修改,这些配方能够处理诸如依赖升级、代码迁移、模式应用等任务。
-
自定义配方: 开发者可以编写自己的配方来满足特定的重构需要。
-
IDE 集成: 它可以集成到常见的集成开发环境(如 IntelliJ IDEA 和 VS Code)中,这样开发者就能在他们熟悉的环境中应用配方。
-
构建工具集成: OpenRewrite 可以集成到 Maven 和 Gradle 等构建工具中,允许在构建过程中自动应用重构。
-
多语言支持: 尽管主要关注 Java,OpenRewrite 还为其他语言和格式提供了支持。
-
可扩展性: OpenRewrite 设计为可扩展,支持创建新的访问者和配方,以处理特定于语言的或者定制的重构要求。
核心特性
-
无损语义树(Lossless Semantic Trees, LST):
- LST 是 OpenRewrite 中用于表示源代码的一种数据结构,它是一种抽象语法树(AST)的变体。
- LST 保留了源代码中的类型信息和格式,使得在进行代码转换时能够保持原始代码的格式和风格,提高转换的准确性和可靠性。
-
访问器(Visitors):
- 访问器是 OpenRewrite 中的核心组件,用于遍历和修改 LST。
- 访问器定义了在遍历 LST 时要执行的操作,如查找特定类型的代码元素、修改代码元素的属性或结构等。
-
配方(Recipes):
- 配方是一组预定义的或自定义的访问器,它们定义了对 LST 进行的具体修改操作。
- 配方可以针对常见的框架迁移、安全修复和风格一致性任务进行预打包,也可以根据特定需求进行自定义开发。
工作原理
OpenRewrite 的工作原理主要包括以下几个步骤:
- 解析源代码:将源代码文件解析为 LST 表示形式。
- 遍历和修改 LST:使用访问器遍历 LST,并根据配方中定义的规则进行修改操作。
- 重新生成源代码:将修改后的 LST 重新生成为源代码文件。
- 审查和提交更改:开发人员可以审查代码中的更改,并根据需要进行进一步的调整,然后提交更改后的代码。
优势与特点
- 高效性:OpenRewrite 能够显著减少手动修改代码的工作量,提高代码重构的效率。
- 准确性:通过 LST 和访问器的结合,OpenRewrite 能够进行准确的代码转换和搜索。
- 灵活性:支持预定义的配方和自定义的配方开发,满足不同的项目需求。
- 集成性:OpenRewrite 提供了 Maven 插件等构建工具插件,方便与现有的构建流程集成。
使用方式
要使用 OpenRewrite,通常需要:
-
选择或创建配方: 您可以从 OpenRewrite 提供的配方库中选择现成的配方,或者根据需求创建自己的配方。
-
应用配方: 使用命令行工具、构建插件或 IDE 插件将配方应用到您的代码库。
-
查看和合并更改: 重构后,您可以查看 OpenRewrite 所做的更改并将它们合并到您的代码库中。
OpenRewrite有多种使用方式,可以在Maven中使用 OpenRewrite,主要步骤包括: -
配置 Maven 插件:在 Maven 项目的
pom.xml
文件中添加 OpenRewrite Maven 插件配置,并指定要运行的配方。 -
执行 Maven 命令:在命令行中运行 Maven 命令(如
mvn rewrite:run
),触发 OpenRewrite 插件执行配方。 -
审查和提交代码:查看代码中的更改,并根据需要进行进一步的调整,然后提交更改后的代码。
具体示例如下:
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 是一个用于大规模自动化代码重构的开源框架,它极大地提升了开发人员的研发效率,通过自动化地进行代码重构和转换,帮助开发人员消除代码库中的技术债务。 通过 LST、访问器和配方的结合,OpenRewrite 能够实现准确的代…...

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

Windows电脑如何启动RTSP服务实现本地摄像头数据共享
技术背景 提起Windows共享本地摄像头,好多人想到的是通过ffmepg或vlc串流到服务器,实际上,用轻量级RTSP服务更简单,本文就介绍下,如何用大牛直播SDK的Windows轻量级RTSP服务,采集摄像头,生成本…...
探索 Spring WebFlux:构建响应式 Web 应用
探索 Spring WebFlux:构建响应式 Web 应用 随着互联网的发展,传统的同步编程模型已经难以应对高并发和高吞吐量的需求。为了解决这些问题,响应式编程逐渐成为主流。Spring WebFlux 是 Spring 5 引入的一个响应式 Web 框架,它基于…...

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

css 作业 2
文章目录 前言第四题第五题第六题第七题第八题第九题第十题(子标签) 前言 昨天写了前面三次作业,今天把剩下的七个作业写完 第四题 http://127.0.0.1:5500/index1.html,就用这个网址查看代码在网页的展示效果 代码评测过不了&…...
axios在vue中的使用
文章目录 一、axios是什么?二、使用步骤2.1 下载2.2 引入2.3 使用Get请求Post请求Forms 三、封装 一、axios是什么? Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和no…...

FastAPI(七十七)实战开发《在线课程学习系统》接口开发-- 课程编辑和查看评论
源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 课程编辑 先来看下课程编辑 1.判断是否登录 2.判断课程是否存在 3.是否有权限(只有自己可以修改自己的课程) 4.名称是否重复…...

【JavaEE初阶】线程的概念及创建
目录 📕 前言 📕 认识线程(Thread) 🚩 概念 😊线程是什么 🙂 为啥要有线程 😭 进程和线程的区别(面试题重点) 🤭 Java的线程和操作系统线程…...

0727,学什么学,周六就应该休息!!!!!
周六就应该休息,一天就忙了两小时也不是我的错喵 目录 UDP的小总结 01:使用select实现一个基于UDP的一对一即时聊天程序。 1.0 复读机服务器和树洞客户端 2.0 byby不了一点的敬业服务器!!! 今天到此为止&#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自动补全(选做)2.1、Bash2.2、Zsh2.3、fish2.4、PowerShell 3、创建存放kubeconfig文件的目录4、添加到 $HOME/.kube/config4.1、kube…...

通过 WSL 2 在Windows 上挂载 Linux 磁盘
原文查看 曾为了传输或者共享不同系统的文件频繁地在 Windows 和 Linux 系统之间切换,效率过低,所以尝试通过 WSL 2 在Windows 上挂载 Linux 磁盘。 先决条件 需要在Windows 10 2004 及更高版本(Build 19041 及更高版本)或 Win…...
【C#】在一个给定的宽、高范围内,获取到该多边形内部的所有坐标集合?
问题点 使用C#语言在一个给定的宽、高范围内,获取到该多边形内部的所有坐标集合? 这个多边形可能存在交叉及互相重叠部分 图像的宽、高可以定义为:2000*2000 多边形坐标集合:Point[] polygon_points new Point[] { new Point…...
json的数据结构
JSON 的数据结构 JSON 由两种数据结构组成:对象(字典)和数组。 一、对象 对象(object)是由键值对组成的无序集合。 键是字符串,值可以是任何类型,包括对象和数组;对象由一对花括…...
html-docx-js和file-saver实现html导出word
依赖html-docx-js,file-saver,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,即图像存储与传输系统,是应用于医院中管理医疗设备如CT,MR等产生的医学图像的信息系统。目标是支持在医院内部所有关于图像的活动,集成了医疗设备,图像存储和分发,数字图像在重要诊断和会诊时的显示&a…...

Golang | Leetcode Golang题解之第292题Nim游戏
题目: 题解: func canWinNim(n int) bool {return n%4 ! 0 }...
Redis在SpringBoot中配置
lettuce redis的使用方法有两种,jedis和lecttuce,jedis用的不是很多,下面讲解用lettuce的使用方法。 首先导包: <!--redis依赖--> <dependency><groupId>org.springframework.boot</groupId><artif…...

linux 网络子系统
__netif_receive_skb_core 是 Linux 内核网络子系统中一个非常重要的函数,它负责将网络设备驱动层接收到的数据包传递到上层协议栈进行处理。以下是对该函数的一些关键点的详细解析: 一、函数作用 __netif_receive_skb_core 函数是处理接收到的网络数据…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...