Maven项目中不修改 pom.xml 状况下直接运行OpenRewrite的配方

在Java 的Maven项目中,可以在pom.xml 中配置插件用来运行OpenRewrite的Recipe,但是有一些场景是希望不修改pom.xml 文件就可以运行Recipe,比如:

  1. 因为不需要经常运行 OpenRewrite,所以不想在pom.xml 加入不常使用的插件配置
  2. 开发了一个专门用于运行Recipe的项目,用来对其它项目进行升级。

针对上面的场景,解决方法就是使用命令行的方式运行Recipe。

命令运行 OpenRewrite 的类别

根据配方的不同类型,可以将命令行运行配方的类型分为三种:

  1. 配方来自核心 Rewrite 库
  2. 配方来自其他库
  3. 自定义配方的运行

1. 核心 Rewrite 库的配方的命令行运行

什么是核心 Rewrite 库配方?

核心 Rewrite 库配方是位于下面GitHub 库的配方:
https://github.com/openrewrite/rewrite

这些配方包括了Java升级,Maven,json, xml ,yaml 等配方。

以 rewrite-java 中的RemoveUnusedImports配方的执行为例,整个配方是移除Java类中没有用的Import 语句。

执行的命令如下:

复制代码
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run -Drewrite.activeRecipes=org.openrewrite.java.RemoveUnusedImports
  • -U参数是一个命令行选项,用于强制 Maven 更新快照(snapshot)依赖和发布版本(release)依赖的最新版本信息。具体来说,运行一个 Maven 命令并附带-U参数时,Maven 会在执行之前检查远程仓库中的依赖更新,并尝试下载最新的依赖版本信息(包括快照版本)。
  • -Drewrite.activeRecipes=org.openrewrite.java.RemoveUnusedImports是一个 Maven 属性设置,它告诉rewrite-maven-plugin插件要激活哪个配方(recipe)。

上面命令的作用就是: 强制更新依赖信息,并使用rewrite-maven-plugin插件的run目标来执行RemoveUnusedImports配方,从而移除 Java 代码中的未使用导入。

2. 配方来自其他库的命令行运行

其他库指的就是非核心 Rewrite 库的配方, 举例来说:

Oracle Java 在9之后的版本将 javax 的命名空间修改为jakarta, 再具体一点 之前调用位于 javax.mail 的发信相关的类的命名空间 ,在Java 9之后要修改为 jakarta.mail。

openrewrite 提供了转换包名的recipe: javaxmigrationtojakarta, 详细介绍地址:
https://docs.openrewrite.org/recipes/java/migrate/jakarta/javaxmigrationtojakarta

对于这种类型的配方的运行,在命令行需要指定配方的工件坐标。

这个配方的GitHub 的地址是:

https://github.com/openrewrite/rewrite-migrate-java/blob/main/src/main/resources/META-INF/rewrite/jakarta-ee-9.yml

使用 -Drewrite.recipeArtifactCoordinates 指定配方的坐标,完整的命令如下:

复制代码
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run \
  -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:LATEST \
  -Drewrite.activeRecipes=org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
  1. -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:LATEST :
    • -D参数用于设置系统属性。
    • rewrite.recipeArtifactCoordinatesrewrite-maven-plugin插件的一个配置选项,用于指定要使用的"食谱"的坐标。
    • org.openrewrite.recipe:rewrite-migrate-java:LATEST指定了食谱的 groupId、artifactId 和版本。LATEST是一个占位符,指示 Maven 使用可用的最新版本。这个食谱包含了一系列预定义的迁移规则,用于更新 Java 代码。
  2. -Drewrite.activeRecipes=org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta :
    • 这个参数同样使用-D来设置系统属性。
    • rewrite.activeRecipes指定了要在当前构建中应用的特定迁移规则的列表。
    • org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta是迁移规则的标识符,它指示插件应用将javax包迁移到jakarta包的规则。这是 Java EE 到 Jakarta EE 迁移的一部分,其中javax命名空间被迁移到jakarta命名空间。

3. 自定义配方的运行

自行开发的 Imperative recipes (命令式配方), 运行的命令 2 的情形是类似的,将自定义的配方发布到私有库或是本地库,通过指定工件坐标的方式来运行。

参数的传递

命令行的方式是无法传递参数的,如果要传递参数要怎么处理呢?

方式就是通过 rewrite.yml 文件

  1. 在项目根目录中创建或更新 rewrite.yml
    定义一个新配方,该配方包装了要运行的配方并指定了要使用的参数。
    示例(以 recipePkgRename
    配方为例):

    type: specs.openrewrite.org/v1beta/recipe
    name: com.osxm.recipePkgRename
    recipeList:

运行配方:

使用 Maven 插件运行新定义的配方。

示例命令:

复制代码
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run 
  -Drewrite.activeRecipes=com.osxm.recipePkgRename


相关推荐
我命由我123452 小时前
Kotlin 数据容器 - List(List 概述、创建 List、List 核心特性、List 元素访问、List 遍历)
java·开发语言·jvm·windows·java-ee·kotlin·list
武子康4 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
YuTaoShao7 小时前
【LeetCode 热题 100】131. 分割回文串——回溯
java·算法·leetcode·深度优先
源码_V_saaskw7 小时前
JAVA图文短视频交友+自营商城系统源码支持小程序+Android+IOS+H5
java·微信小程序·小程序·uni-app·音视频·交友
超浪的晨7 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
双力臂4048 小时前
Spring Boot 单元测试进阶:JUnit5 + Mock测试与切片测试实战及覆盖率报告生成
java·spring boot·后端·单元测试
Edingbrugh.南空8 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
QQ_4376643149 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0019 小时前
设计模式-迭代器模式
java·设计模式·迭代器模式
誰能久伴不乏9 小时前
Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
java·服务器·前端