OpenRewrite 導入指引

導入效應

效應 說明
自動化重構 大規模程式碼改寫(如 Java 17→21、Spring Boot 2→3)一次完成
框架升級 Spring Boot 2.x → 3.x 自動處理 API 變更、設定改寫
AI 產碼後處理 AI 產生的過時寫法,OpenRewrite 自動更新為最新最佳實踐
零手動修改 rewrite run 一條指令完成數千個檔案的改寫
可組合 Recipe 多種改寫規則可組合,一次處理多種升級需求
Spring 團隊背書 由 Spring 團隊的 Moderne 開發,品質有保障

1. Maven Plugin

<plugin>
    <groupId>org.openrewrite.recipe</groupId>
    <artifactId>rewrite-maven-plugin</artifactId>
    <version>6.29.0</version>
    <configuration>
        <activeRecipes>
            <recipe>org.openrewrite.java.migrate.UpgradeToJava21</recipe>
            <recipe>org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4</recipe>
        </activeRecipes>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.openrewrite.recipe</groupId>
            <artifactId>rewrite-migrate-java</artifactId>
            <version>3.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.openrewrite.recipe</groupId>
            <artifactId>rewrite-spring</artifactId>
            <version>6.1.0</version>
        </dependency>
    </dependencies>
</plugin>

2. Gradle Plugin

plugins {
    id 'org.openrewrite.rewrite' version '7.3.0'
}

rewrite {
    activeRecipe(
        'org.openrewrite.java.migrate.UpgradeToJava21',
        'org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4'
    )
}

dependencies {
    rewrite('org.openrewrite.recipe:rewrite-migrate-java:3.6.0')
    rewrite('org.openrewrite.recipe:rewrite-spring:6.1.0')
}

3. 常用 Recipe

3.1 Java 版本升級

# Java 8 → 11
mvn rewrite:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:RELEASE -Drewrite.activeRecipes=org.openrewrite.java.migrate.UpgradeToJava11

# Java 11 → 17
mvn rewrite:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:RELEASE -Drewrite.activeRecipes=org.openrewrite.java.migrate.UpgradeToJava17

# Java 17 → 21
mvn rewrite:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:RELEASE -Drewrite.activeRecipes=org.openrewrite.java.migrate.UpgradeToJava21

3.2 Spring Boot 升級

# Spring Boot 2.x → 3.x
mvn rewrite:run -Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-spring:RELEASE -Drewrite.activeRecipes=org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4

3.3 常見 Recipe 列表

Recipe 說明
UpgradeToJava21 Java 21 升級
UpgradeSpringBoot_3_4 Spring Boot 3.4 升級
MigrateToJUnit5 JUnit 4 → 5
CommonStaticAnalysis 靜態分析最佳實踐
RemoveUnusedImports 移除未使用的 import
FormatJava Java 格式化

4. Dry Run(預覽變更)

# 只顯示會變更什麼,不實際修改
mvn rewrite:dryRun

# 產生 diff 報告
mvn rewrite:dryRun -Drewrite.dryRunOutputPath=rewrite-diff.patch

5. 自訂 Recipe

5.1 YAML Recipe

# rewrite.yml
type: specs.openrewrite.org/v1beta/recipe
name: com.example.RemoveLog4j
displayName: Remove Log4j 1.x
description: 將 Log4j 1.x 替換為 SLF4J

recipeList:
  - org.openrewrite.java.ChangeDependency:
      oldGroupId: log4j
      oldArtifactId: log4j
      newGroupId: org.slf4j
      newArtifactId: slf4j-log4j12
  - org.openrewrite.java.ChangeType:
      oldFullyQualifiedName: org.apache.log4j.Logger
      newFullyQualifiedName: org.slf4j.Logger

5.2 Java Recipe

public class CustomRecipe extends Recipe {
    @Override
    public String getDisplayName() {
        return "Replace RestTemplate with WebClient";
    }

    @Override
    public TreeVisitor<?, ExecutionContext> getVisitor() {
        return new ChangeType(
            "org.springframework.web.client.RestTemplate",
            "org.springframework.web.reactive.function.client.WebClient"
        );
    }
}

6. CI 整合

6.1 Azure Pipeline

- stage: AutoRefactor
  jobs:
    - job: OpenRewrite
      steps:
        - task: Maven@4
          inputs:
            goals: 'rewrite:run'
            options: '-Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-spring:RELEASE'
          displayName: 'OpenRewrite Auto Refactor'
        - script: |
            git diff --stat
          displayName: 'Show Changes'

7. Moderne Platform(雲端版)

# 安裝 Moderne CLI
brew install moderne

# 雲端執行(支援跨 Repo 改寫)
moderne run --recipe org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4

8. 參考資源