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


相关推荐
桦说编程13 分钟前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen14 分钟前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研16 分钟前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
没有bug.的程序员1 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋1 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国2 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~2 小时前
《设计模式》装饰模式
java·设计模式
A尘埃2 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统
青云交2 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
CHEN5_023 小时前
【Java基础面试题】Java基础概念
java·开发语言