OpenRewrite执行首个替换后停止运行后续配方问题求助
问题原因及解决方法
原因
OpenRewrite的文本类FindAndReplace配方默认基于原始文件快照执行,所有配方共享同一初始文件状态,而非依次基于前一个配方的修改结果运行。也就是说,第一个配方将Europe替换为World的修改,不会被第二个配方感知到,第二个配方只能匹配原始文件中存在的World:
- 首次执行时,原始文件只有
Europe,第二个配方无匹配项,因此不生效; - 补充测试中,核心逻辑仍是文本配方不共享修改状态,若原始文件的
World未被替换,大概率是该机制导致的预期外结果。
解决方法
方案1:合并替换规则(最直接)
直接跳过中间步骤,将Europe一次性替换为Universe,简化配方配置:
--- type: specs.openrewrite.org/v1beta/recipe name: company.TestReplaceText recipeList: - org.openrewrite.text.FindAndReplace: regex: false find: Europe replace: Universe filePattern: '**/*.java'
方案2:使用AST级替换实现链式执行
改用Java语法树(AST)级别的替换配方,这类配方会基于前一个修改后的结果继续执行,完美支持依次替换:
--- type: specs.openrewrite.org/v1beta/recipe name: company.TestReplaceText recipeList: - org.openrewrite.java.ChangeLiteral: literal: "Hello Europe!" newLiteral: "Hello World!" filePattern: '**/*.java' - org.openrewrite.java.ChangeLiteral: literal: "Hello World!" newLiteral: "Hello Universe!" filePattern: '**/*.java'
方案3:正则合并替换(灵活适配多场景)
若需同时处理Europe和World,可使用正则表达式合并替换逻辑,一次完成所有目标替换:
--- type: specs.openrewrite.org/v1beta/recipe name: company.TestReplaceText recipeList: - org.openrewrite.text.FindAndReplace: regex: true find: (Europe|World) replace: Universe filePattern: '**/*.java'
内容的提问来源于stack exchange,提问作者Olivier Faucheux
相关产品推荐
相关产品推荐

