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'
# 安裝 Moderne CLI
brew install moderne
# 雲端執行(支援跨 Repo 改寫)
moderne run --recipe org.openrewrite.java.spring.boot3.UpgradeSpringBoot_3_4
8. 參考資源