代码自动化重构工具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 函数是处理接收到的网络数据…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...