在Java 的Maven项目中,可以在pom.xml 中配置插件用来运行OpenRewrite的Recipe,但是有一些场景是希望不修改pom.xml 文件就可以运行Recipe,比如:
- 因为不需要经常运行 OpenRewrite,所以不想在pom.xml 加入不常使用的插件配置
- 开发了一个专门用于运行Recipe的项目,用来对其它项目进行升级。
针对上面的场景,解决方法就是使用命令行的方式运行Recipe。
命令运行 OpenRewrite 的类别
根据配方的不同类型,可以将命令行运行配方的类型分为三种:
- 配方来自核心 Rewrite 库
- 配方来自其他库
- 自定义配方的运行
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 的地址是:
使用 -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
-Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:LATEST
:-D
参数用于设置系统属性。rewrite.recipeArtifactCoordinates
是rewrite-maven-plugin
插件的一个配置选项,用于指定要使用的"食谱"的坐标。org.openrewrite.recipe:rewrite-migrate-java:LATEST
指定了食谱的 groupId、artifactId 和版本。LATEST
是一个占位符,指示 Maven 使用可用的最新版本。这个食谱包含了一系列预定义的迁移规则,用于更新 Java 代码。
-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 文件
-
在项目根目录中创建或更新 rewrite.yml
定义一个新配方,该配方包装了要运行的配方并指定了要使用的参数。
示例(以 recipePkgRename
配方为例):type: specs.openrewrite.org/v1beta/recipe
name: com.osxm.recipePkgRename
recipeList:- org.openrewrite.java.ChangePackage:
oldPackageName: org.old.package.name
newPackageName: org.new.package.name
- org.openrewrite.java.ChangePackage:
运行配方:
使用 Maven 插件运行新定义的配方。
示例命令:
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run
-Drewrite.activeRecipes=com.osxm.recipePkgRename