CLOVER🍀

That was when it all began.

リファクタリングツールOpenRewriteを、Java 21とJakarta EE 10への移行レシピで試してみる

これは、なにをしたくて書いたもの?

ソースコードリファクタリングしてくれるツールである、OpenRewriteというものがあります。

前々から名前は知っていたのですが、1度試してみようかなということで。

OpenRewrite

OpenRewriteのドキュメントはこちら。

OpenRewrite by Moderne | Large Scale Automated Refactoring | OpenRewrite Docs

GitHubリポジトリーはこちら。

GitHub - openrewrite/rewrite: Automated mass refactoring of source code.

OpenRewriteはフレームワークの移行、セキュリティーに関する修正といったタスク向けに、パッケージング済みのリファクタリングレシピを
実行する自動リファクタリングエンジンです。
オープンソースで提供されており、GradleやApache Mavenプラグインとして実行できます。

サポートしている言語やフレームワークなどは以下が掲載されています。

Supported languages | OpenRewrite Docs

「レシピ」を見ると他の言語でも使えそうに見えるのですが、これはModerneという商用ツールのサポート範囲になります。

Recipe catalog | OpenRewrite Docs

実際の使い方はこちらを見るとよいでしょう。

Running Recipes | OpenRewrite Docs

基本的にはApache MavenまたはGradleのプラグインを追加して

Quickstart: Setting up your project and running recipes / Step 2: Add rewrite-maven-plugin or rewrite-gradle-plugin to your project

使いたいレシピを設定

Quickstart: Setting up your project and running recipes / Step 3: Activate a recipe

そして実行、という流れになります。

Quickstart: Setting up your project and running recipes / Step 4: Run a simple refactoring recipe

レシピ自体はこちらから探すことになるでしょう。

Popular recipe guides | OpenRewrite Docs

Recipe catalog | OpenRewrite Docs

レシピ自体を作成したい場合はこちらを見るようです。

Authoring Recipes | OpenRewrite Docs

レシピのライセンスはApache License Version 2.0とModern Source Available Licenseがありそうです。

Moderne Source Available License Agreement | Moderne Docs

商用ライセンスである、Moderne Proprietary Licenseのものもありますが。

Moderne Proprietary License | Moderne Docs

Modern Source Available Licenseを見ていると、単純に使う分には問題なさそうですね。

今回はJakarta EE 10へ移行するレシピを試してみたいと思います。

Migrate to Jakarta EE 10.0 | OpenRewrite Docs

Migrate to Jakarta EE 10 | OpenRewrite Docs

特に移行元は書いておらず、Jakarta EE 9やJava EEからも移行できるようですが、今回はJava EE 8から移行してみます。

また合わせて、Javaのバージョンアップに関する移行もやってみましょう。

Migrate to Java 21 | OpenRewrite Docs

環境

今回の環境はこちら。

$ java -version
openjdk version "1.8.0_462"
OpenJDK Runtime Environment (build 1.8.0_462-8u462-ga~us1-0ubuntu2~24.04.2-b08)
OpenJDK 64-Bit Server VM (build 25.462-b08, mixed mode)


$ java --version
openjdk 21.0.8 2025-07-15
OpenJDK Runtime Environment (build 21.0.8+9-Ubuntu-0ubuntu124.04.1)
OpenJDK 64-Bit Server VM (build 21.0.8+9-Ubuntu-0ubuntu124.04.1, mixed mode, sharing)


$ mvn --version
Apache Maven 3.9.11 (3e54c93a704957b63ee3494413a2b544fd3d825b)
Maven home: $HOME/.sdkman/candidates/maven/current
Java version: 21.0.8, vendor: Ubuntu, runtime: /usr/lib/jvm/java-21-openjdk-amd64
Default locale: ja_JP, platform encoding: UTF-8
OS name: "linux", version: "6.8.0-79-generic", arch: "amd64", family: "unix"

Java EE 8はJava 8で、Jakarta EE 10はJava 21で動かします。

Java EE 8でサンプルプロジェクトの作成

まずはJava EE 8でサンプルプロジェクトを作成します。Javaは8を使います。

$ java -version
openjdk version "1.8.0_462"
OpenJDK Runtime Environment (build 1.8.0_462-8u462-ga~us1-0ubuntu2~24.04.2-b08)
OpenJDK 64-Bit Server VM (build 25.462-b08, mixed mode)

JAX-RSCDIを使ったアプリケーションを作ってみましょう。

    <properties>
        <maven.compiler.release>8</maven.compiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.1.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <version>2.0.SP1</version>
        </dependency>
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>ROOT</finalName>
        <plugins>
            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven3-plugin</artifactId>
                <version>1.10.22</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>run</goal>
                            <goal>start</goal>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <container>
                        <containerId>wildfly26x</containerId>
                        <zipUrlInstaller>
                            <url>
                                https://github.com/wildfly/wildfly/releases/download/26.1.3.Final/wildfly-26.1.3.Final.zip
                            </url>
                        </zipUrlInstaller>
                    </container>
                </configuration>
            </plugin>
        </plugins>
    </build>

アプリケーションサーバーはWildFlyで、Jakarta EE 8をサポートしている最後のバージョンである26.1を使います。

web.xml。今回の構成ではなくすこともできます(むしろ作らない)が、移行されることを確認するために作っています。

`src/main/webapp/WEB-INF/web.xml{

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
    </servlet>
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
</web-app>

JAX-RSリソースクラス。 src/main/java/org/littlewings/openrewrite/HelloResource.java`

package org.littlewings.openrewrite;

import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import java.util.HashMap;
import java.util.Map;

@ApplicationScoped
@Path("/hello")
public class HelloResource {
    @Inject
    private MessageService messageService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Map<String, String> hello(@QueryParam("word") String word) {
        Map<String, String> response = new HashMap<>();
        String baseMessage = word != null ? "Hello " + word + "!!" : "Hello World!!";
        response.put("message", messageService.star(baseMessage));

        return response;
    }
}

CDI管理Bean。

src/main/java/org/littlewings/openrewrite/MessageService.java

package org.littlewings.openrewrite;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class MessageService {
    public String star(String message) {
        return String.format("★★★%s★★★", message);
    }
}

動作確認しましょう。

起動。

$ mvn clean package cargo:run

確認。

$ curl localhost:8080/api/hello
{"message":"★★★Hello World!!★★★"}


$ curl localhost:8080/api/hello?word=WildFly
{"message":"★★★Hello WildFly!!★★★"}

OKですね。

変更差分を見るために、Gitで管理するようにしておきましょう。

$ git init
$ git add pom.xml src
$ git commit -m 'initial'

これで準備は完了です。

OpenRewriteを使って、Java EE 8からJakarta EE 10に移行する

では、OpenRewriteを使ってJava EE 8を使って作成したアプリケーションを、Jakarta EE 10に移行します。

Javaは21を使います。

$ java --version
openjdk 21.0.8 2025-07-15
OpenJDK Runtime Environment (build 21.0.8+9-Ubuntu-0ubuntu124.04.1)
OpenJDK 64-Bit Server VM (build 21.0.8+9-Ubuntu-0ubuntu124.04.1, mixed mode, sharing)
Java 8からJava 21に移行する

Javaのバージョン変更とJakarta EEへの移行のどちらからやるかというところですが、最初はJava 21にしてみましょうか。

Migrate to Java 21 | OpenRewrite Docs

レシピとしては、ソースコードの移行とビルドファイルの移行があります。

Migrate to Java 21 | OpenRewrite Docs

Upgrade build to Java 21 | OpenRewrite Docs

まずはビルドファイルを移行してみましょう。

pom.xmlに以下を追加。

            <plugin>
                <groupId>org.openrewrite.maven</groupId>
                <artifactId>rewrite-maven-plugin</artifactId>
                <version>6.18.0</version>
                <configuration>
                    <exportDatatables>true</exportDatatables>
                    <activeRecipes>
                        <recipe>org.openrewrite.java.migrate.UpgradeBuildToJava21</recipe>
                    </activeRecipes>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.openrewrite.recipe</groupId>
                        <artifactId>rewrite-migrate-java</artifactId>
                        <version>3.17.0</version>
                    </dependency>
                </dependencies>
            </plugin>

exportDatatablesは、trueにするとアクティブなレシピが生成するデータテーブルをエクスポートする設定です。
activeRecipesの配下にアクティブにするレシピを設定します。
そしてレシピを実行するのに必要な依存関係はdependenciesに追加するという感じですね。

基本的には各レシピのドキュメントに沿って設定すればよいでしょう。

org.openrewrite.java.migrate.UpgradeBuildToJava21レシピを使用します。

OpenRewriteのApache Mavenプラグインの使い方はこちらに書かれています。

Maven plugin configuration | OpenRewrite Docs

dryRunしてみましょう。target配下に結果が生成されるようなので、1度mvn cleanして

$ mvn clean

実行。

$ mvn rewrite:dryRun

実行ログ。

[INFO] --- rewrite:6.18.0:dryRun (default-cli) @ openrewrite-example ---
[INFO] Using active recipe(s) [org.openrewrite.java.migrate.UpgradeBuildToJava21]
[INFO] Using active styles(s) []
[INFO] Validating active recipes...
[INFO] Project [openrewrite-example] Resolving Poms...
[INFO] Project [openrewrite-example] Parsing source files
[INFO] Running recipe(s)...
[INFO] Printing available datatables to: target/rewrite/datatables/2025-09-14_11-47-08-547
[WARNING] These recipes would make changes to pom.xml:
[WARNING]     org.openrewrite.java.migrate.UpgradeJavaVersion: {version=21}
[WARNING]         org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion: {version=21}
[WARNING] Patch file available:
[WARNING]     /path/to/target/rewrite/rewrite.patch
[WARNING] Estimate time saved: 5m
[WARNING] Run 'mvn rewrite:run' to apply the recipes.

パッチファイルができたようなので確認してみます。

target/rewrite/rewrite.patch

diff --git a/pom.xml b/pom.xml
index e3b3a77..d798cc5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@ org.openrewrite.java.migrate.UpgradeBuildToJava21
     <packaging>war</packaging>

     <properties>
-        <maven.compiler.release>8</maven.compiler.release>
+        <maven.compiler.release>21</maven.compiler.release>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     </properties>

よさそうですね。

データテーブルはこんな感じでした。

target/rewrite/datatables/2025-09-14_11-47-08-547/org.openrewrite.table.RecipeRunStats.csv

"The recipe","Source file count","Source file changed count","Cumulative scanning time (ns)","99th percentile scanning time (ns)","Max scanning time (ns)","Cumulative edit time (ns)","99th percentile edit time (ns)","Max edit time (ns)"
"The recipe whose stats are being measured both individually and cumulatively.","The number of source files the recipe ran over.","The number of source files which were changed in the recipe run. Includes files created, deleted, and edited.","The total time spent across the scanning phase of this recipe.","99 out of 100 scans completed in this amount of time.","The max time scanning any one source file.","The total time spent across the editing phase of this recipe.","99 out of 100 edits completed in this amount of time.","The max time editing any one source file."
"org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion","5","3","0","0.0","0","5940002","6029280.0","5931870"
"org.openrewrite.jenkins.UpgradeJavaVersion","5","3","146475","98176.0","94332","624420","490496.0","485113"
"org.openrewrite.java.migrate.UpgradeJavaVersion","5","3","0","0.0","0","1934831","1507296.0","1479776"
"org.openrewrite.gradle.UpdateJavaCompatibility","5","3","0","0.0","0","376717","130560.0","128409"
"org.openrewrite.maven.UseMavenCompilerPluginReleaseConfiguration","5","3","0","0.0","0","3306321","3407840.0","3289323"
"org.openrewrite.java.migrate.UpgradeBuildToJava21","5","3","78478","63360.0","63375","45680","23296.0","23130"
"org.openrewrite.java.migrate.UpdateSdkMan","5","3","0","0.0","0","852745","587776.0","562374"

target/rewrite/datatables/2025-09-14_11-47-08-547/org.openrewrite.table.SourcesFileResults.csv

"Source path before the run","Source path after the run","Parent of the recipe that made changes","Recipe that made changes","Estimated time saving","Cycle"
"The source path of the file before the run. `null` when a source file was created during the run.","A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run.","In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all.","The specific recipe that made a change.","An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds.","The recipe cycle in which the change was made."
"pom.xml","pom.xml","org.openrewrite.java.migrate.UpgradeJavaVersion","org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion","300","1"
"pom.xml","pom.xml","","org.openrewrite.java.migrate.UpgradeJavaVersion","300","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","org.openrewrite.java.migrate.UpgradeBuildToJava21","org.openrewrite.java.migrate.UpgradeJavaVersion","0","1"
"src/main/java/org/littlewings/openrewrite/HelloResource.java","src/main/java/org/littlewings/openrewrite/HelloResource.java","org.openrewrite.java.migrate.UpgradeBuildToJava21","org.openrewrite.java.migrate.UpgradeJavaVersion","0","1"

では適用します。

$ mvn rewrite:run

実行ログ。

[INFO] --- rewrite:6.18.0:run (default-cli) @ openrewrite-example ---
[INFO] Using active recipe(s) [org.openrewrite.java.migrate.UpgradeBuildToJava21]
[INFO] Using active styles(s) []
[INFO] Validating active recipes...
[INFO] Project [openrewrite-example] Resolving Poms...
[INFO] Project [openrewrite-example] Parsing source files
[INFO] Running recipe(s)...
[INFO] Printing available datatables to: target/rewrite/datatables/2025-09-14_11-49-30-841
[WARNING] Changes have been made to pom.xml by:
[WARNING]     org.openrewrite.java.migrate.UpgradeJavaVersion: {version=21}
[WARNING]         org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion: {version=21}
[WARNING] Please review and commit the results.
[WARNING] Estimate time saved: 5m

差分を確認。

$ git diff
diff --git a/pom.xml b/pom.xml
index 4b9c750..d798cc5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@
     <packaging>war</packaging>

     <properties>
-        <maven.compiler.release>8</maven.compiler.release>
+        <maven.compiler.release>21</maven.compiler.release>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     </properties>
@@ -67,6 +67,24 @@
                     </container>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.openrewrite.maven</groupId>
+                <artifactId>rewrite-maven-plugin</artifactId>
+                <version>6.18.0</version>
+                <configuration>
+                    <exportDatatables>true</exportDatatables>
+                    <activeRecipes>
+                        <recipe>org.openrewrite.java.migrate.UpgradeBuildToJava21</recipe>
+                    </activeRecipes>
+                </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.openrewrite.recipe</groupId>
+                        <artifactId>rewrite-migrate-java</artifactId>
+                        <version>3.17.0</version>
+                    </dependency>
+                </dependencies>
+            </plugin>
         </plugins>
     </build>
 </project>

確かに変更されました。

コミットしておきます。

$ git add pom.xml
$ git commit -m 'upgrade build to Java 21'

次はJava 21のレシピを適用してみましょう。

Migrate to Java 21 | OpenRewrite Docs

アクティブにするレシピをorg.openrewrite.java.migrate.UpgradeToJava21に変更します。

                    <activeRecipes>
                        <recipe>org.openrewrite.java.migrate.UpgradeToJava21</recipe>
                    </activeRecipes>

というのもですね、よく見るとレシピというのは複数のレシピから構成されていることもあるようです。Java 21への移行レシピの場合、
ビルドファイルをアップグレードするレシピも含まれているからです。

Migrate to Java 21 / Definition

まあビルドファイルの移行のレシピを単体で実行する必要はありませんでした…と。

試しに以下を元に戻しておいてみます。

        <maven.compiler.release>8</maven.compiler.release>

dryRun。

$ mvn clean rewrite:dryRun

実行ログ。

[INFO] --- rewrite:6.18.0:dryRun (default-cli) @ openrewrite-example ---
[INFO] Using active recipe(s) [org.openrewrite.java.migrate.UpgradeToJava21]
[INFO] Using active styles(s) []
[INFO] Validating active recipes...
[INFO] Project [openrewrite-example] Resolving Poms...
[INFO] Project [openrewrite-example] Parsing source files
[INFO] Running recipe(s)...
[INFO] Printing available datatables to: target/rewrite/datatables/2025-09-14_12-06-17-070
[WARNING] These recipes would make changes to pom.xml:
[WARNING]     org.openrewrite.java.migrate.UpgradeToJava17
[WARNING]         org.openrewrite.java.migrate.Java8toJava11
[WARNING]             org.openrewrite.java.migrate.javax.AddInjectDependencies
[WARNING]                 org.openrewrite.java.dependencies.AddDependency: {groupId=jakarta.inject, artifactId=jakarta.inject-api, version=1.0.3, onlyIfUsing=javax.inject.*, acceptTransitive=true}
[WARNING]             org.openrewrite.java.migrate.UpgradeBuildToJava11
[WARNING]                 org.openrewrite.java.migrate.UpgradeJavaVersion: {version=11}
[WARNING]                     org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion: {version=11}
[WARNING]         org.openrewrite.java.migrate.UpgradeBuildToJava17
[WARNING]             org.openrewrite.java.migrate.UpgradeJavaVersion: {version=17}
[WARNING]                 org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion: {version=17}
[WARNING]         org.openrewrite.java.migrate.UpgradeBuildToJava21
[WARNING]             org.openrewrite.java.migrate.UpgradeJavaVersion: {version=21}
[WARNING]                 org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion: {version=21}
[WARNING] These recipes would make changes to src/main/java/org/littlewings/openrewrite/MessageService.java:
[WARNING]     org.openrewrite.java.migrate.UpgradeToJava17
[WARNING]         org.openrewrite.java.migrate.Java8toJava11
[WARNING]             org.openrewrite.java.migrate.UpgradeBuildToJava11
[WARNING]                 org.openrewrite.java.migrate.UpgradeJavaVersion: {version=11}
[WARNING]         org.openrewrite.java.migrate.UpgradeBuildToJava17
[WARNING]             org.openrewrite.java.migrate.UpgradeJavaVersion: {version=17}
[WARNING]         org.openrewrite.java.migrate.lang.StringFormatted: {addParentheses=false}
[WARNING]         org.openrewrite.java.migrate.UpgradeBuildToJava21
[WARNING]             org.openrewrite.java.migrate.UpgradeJavaVersion: {version=21}
[WARNING] Patch file available:
[WARNING]     /path/to/target/rewrite/rewrite.patch
[WARNING] Estimate time saved: 5m
[WARNING] Run 'mvn rewrite:run' to apply the recipes.

もうちょっと詳しい結果になりましたね。

パッチファイルを確認。

target/rewrite/rewrite.patch

diff --git a/pom.xml b/pom.xml
index 512eac7..5bbfd96 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,13 +10,18 @@ org.openrewrite.java.migrate.UpgradeToJava21
     <packaging>war</packaging>

     <properties>
-        <maven.compiler.release>8</maven.compiler.release>
+        <maven.compiler.release>21</maven.compiler.release>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
     </properties>

     <dependencies>
         <dependency>
+            <groupId>jakarta.inject</groupId>
+            <artifactId>jakarta.inject-api</artifactId>
+            <version>1.0.3</version>
+        </dependency>
+        <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
             <version>3.1.0</version>

diff --git a/src/main/java/org/littlewings/openrewrite/MessageService.java b/src/main/java/org/littlewings/openrewrite/MessageService.java
index 58122e9..c7f4d2a 100644
--- a/src/main/java/org/littlewings/openrewrite/MessageService.java
+++ b/src/main/java/org/littlewings/openrewrite/MessageService.java
@@ -5,6 +5,6 @@ org.openrewrite.java.migrate.UpgradeToJava21
 @ApplicationScoped
 public class MessageService {
     public String star(String message) {
-        return String.format("★★★%s★★★", message);
+        return "★★★%s★★★".formatted(message);
     }
 }

確かにビルドファイルの変更も含まれますね。String#formatは修正されてしまいました(笑)。

あとは依存関係も修正されていますね。

データテーブル。

target/rewrite/datatables/2025-09-14_12-06-17-070/org.openrewrite.table.RecipeRunStats.csv

"The recipe","Source file count","Source file changed count","Cumulative scanning time (ns)","99th percentile scanning time (ns)","Max scanning time (ns)","Cumulative edit time (ns)","99th percentile edit time (ns)","Max edit time (ns)"
"The recipe whose stats are being measured both individually and cumulatively.","The number of source files the recipe ran over.","The number of source files which were changed in the recipe run. Includes files created, deleted, and edited.","The total time spent across the scanning phase of this recipe.","99 out of 100 scans completed in this amount of time.","The max time scanning any one source file.","The total time spent across the editing phase of this recipe.","99 out of 100 edits completed in this amount of time.","The max time editing any one source file."
"org.openrewrite.java.migrate.net.MigrateMulticastSocketGetTTLToGetTimeToLive","5","3","4317","3196.0","3189","4017","1584.0","1554"
"org.openrewrite.java.migrate.UpgradeToJava6","5","3","6537","4600.0","4359","3113","1528.0","1494"
"org.openrewrite.java.migrate.UpgradeToJava17","5","3","10662","6904.0","6842","5034","1904.0","1891"
"org.openrewrite.java.migrate.UpgradeToJava7","5","3","9171","4080.0","3988","3814","1456.0","1431"
"org.openrewrite.java.migrate.lang.SwitchCaseAssignmentsToSwitchExpression","5","3","0","0.0","0","1581392","983036.0","959515"
"org.openrewrite.java.migrate.UpgradeToJava8","5","3","16334","8184.0","8028","3116","1328.0","1280"
"org.openrewrite.maven.ChangeManagedDependencyGroupIdAndArtifactId","5","3","0","0.0","0","49484","49150.0","48782"
"org.openrewrite.java.migrate.sql.MigrateDriverManagerSetLogStream","5","3","0","0.0","0","4005","1980.0","1945"
"org.openrewrite.java.migrate.UpgradeToJava21","5","3","95248","94200.0","90832","37096","30688.0","29861"
"org.openrewrite.java.migrate.javax.MigrateAbstractTypeVisitor6To9","5","3","10680","8700.0","8507","5101","2416.0","2349"
"org.openrewrite.config.DeclarativeRecipe$PreconditionBellwether","5","3","0","0.0","0","176304","94080.0","91896"
"org.openrewrite.java.migrate.JREJdbcInterfaceNewMethods","5","3","13662","6392.0","6157","11841","6384.0","6398"
"org.openrewrite.java.dependencies.ChangeDependency","5","3","0","0.0","0","4983014","524286.0","572625"
"org.openrewrite.java.migrate.javax.MigrateXMLEventFactoryNewInstanceToNewFactory","5","3","2462","1340.0","1283","4775","2544.0","2503"
"org.openrewrite.java.migrate.lombok.LombokValToFinalVar","5","3","0","0.0","0","112203","63472.0","63439"
"org.openrewrite.java.migrate.ReplaceComSunAWTUtilitiesMethods","5","3","0","0.0","0","202392","131068.0","128510"
"org.openrewrite.java.migrate.javax.MigrateAbstractAnnotationValueVisitor6To9","5","3","4670","3452.0","3452","3679","1584.0","1592"
"org.openrewrite.java.migrate.jakarta.JavaxAnnotationMigrationToJakartaAnnotation","5","3","8453","2424.0","2383","9351","2400.0","2309"
"org.openrewrite.java.migrate.util.ListFirstAndLast","5","3","0","0.0","0","46387","24568.0","24370"
"org.openrewrite.java.ReplaceStringLiteralValue","5","3","0","0.0","0","462643","376824.0","375930"
"org.openrewrite.java.migrate.UpdateSdkMan","5","3","0","0.0","0","1018077","556032.0","524857"
"org.openrewrite.java.migrate.net.MigrateURLEncoderEncode","5","3","0","0.0","0","5230","2428.0","2345"
"org.openrewrite.java.migrate.lang.MigrateCharacterIsSpaceToIsWhitespace","5","3","4292","3068.0","2998","6103","1904.0","1910"
"org.openrewrite.java.migrate.concurrent.MigrateAtomicIntegerWeakCompareAndSetToWeakCompareAndSetPlain","5","3","8426","5116.0","5038","6867","2672.0","2640"
"org.openrewrite.java.migrate.concurrent.MigrateAtomicReferenceWeakCompareAndSetToWeakCompareAndSetPlain","5","3","4507","3196.0","3166","5998","2160.0","2156"
"org.openrewrite.java.migrate.logging.MigrateInterfaceLoggingMXBeanToPlatformLoggingMXBean","5","3","4106","3068.0","3029","6155","2416.0","2382"
"org.openrewrite.java.migrate.javax.MigrateCounterMonitorSetThresholdToSetInitThreshold","5","3","3214","2300.0","2182","2735","1144.0","1128"
"org.openrewrite.java.migrate.logging.MigrateGetLoggingMXBeanToGetPlatformMXBean","5","3","0","0.0","0","11775","7932.0","7723"
"org.openrewrite.java.migrate.InternalBindPackages","5","3","2828","1660.0","1651","8295","2912.0","2889"
"org.openrewrite.java.ChangeMethodInvocationReturnType","5","3","0","0.0","0","181747","114684.0","110975"
"org.openrewrite.java.migrate.lang.StringFormatted","5","3","0","0.0","0","11682935","1.205862E7","11663619"
"org.openrewrite.java.migrate.javax.MigrateSimpleAnnotationValueVisitor6To9","5","3","2855","1532.0","1509","3607","1272.0","1252"
"org.openrewrite.maven.AddAnnotationProcessor","5","3","0","0.0","0","817","284.0","283"
"org.openrewrite.staticanalysis.AddSerialAnnotationToSerialVersionUID","5","3","0","0.0","0","312241","204792.0","200756"
"org.openrewrite.java.migrate.RemovedRMIConnectorServerCredentialTypesConstant","5","3","2435","1660.0","1609","3238","1464.0","1423"
"org.openrewrite.java.migrate.concurrent.JavaConcurrentAPIs","5","3","7145","4348.0","4268","17552","6896.0","6673"
"org.openrewrite.java.migrate.javax.AddJaxbRuntime","5","3","169055","77760.0","75163","1537650","1440768.0","1397538"
"org.openrewrite.java.migrate.ChangeDefaultKeyStore","5","3","0","0.0","0","52606","34808.0","33477"
"org.openrewrite.java.migrate.lang.ThreadStopUnsupported","5","3","0","0.0","0","201366","131070.0","127903"
"org.openrewrite.gradle.UpdateJavaCompatibility","5","3","0","0.0","0","170225","53120.0","51905"
"org.openrewrite.java.migrate.RemovedFileIOFinalizeMethods","5","3","2360","1340.0","1315","3668","1520.0","1529"
"org.openrewrite.maven.ChangeDependencyScope","5","3","0","0.0","0","66588","69628.0","65652"
"org.openrewrite.java.migrate.lang.MigrateSecurityManagerMulticast","5","3","0","0.0","0","4431","2428.0","2313"
"org.openrewrite.gradle.UpdateGradleWrapper","5","3","3565297","2883072.0","2850258","24135","6880.0","6657"
"org.openrewrite.java.migrate.javax.AddJaxwsRuntime$AddJaxwsRuntimeMaven","5","3","0","0.0","0","86321","86012.0","85582"
"org.openrewrite.java.migrate.javax.AddJaxwsRuntime$AddJaxwsRuntimeGradle","5","3","0","0.0","0","4441","2800.0","2790"
"org.openrewrite.java.migrate.javax.MigrateTypeKindVisitor6To9","5","3","3307","2172.0","2072","4228","1584.0","1578"
"org.openrewrite.java.migrate.logging.MigrateLoggerLogrbToUseResourceBundle","5","3","0","0.0","0","5099","3196.0","3123"
"org.openrewrite.java.migrate.lang.SwitchExpressionYieldToArrow","5","3","0","0.0","0","236743","172028.0","164060"
"org.openrewrite.maven.RemoveRedundantDependencyVersions","5","3","0","0.0","0","752698","245758.0","241657"
"org.openrewrite.java.migrate.UpgradeBuildToJava17","5","3","3356","1720.0","1679","8539","4592.0","4478"
"org.openrewrite.java.ReplaceConstantWithAnotherConstant","5","3","0","0.0","0","25005","12272.0","12048"
"org.openrewrite.maven.UpgradeDependencyVersion","5","3","277688","261888.0","257655","101957","89984.0","87140"
"org.openrewrite.java.migrate.UpgradeBuildToJava11","5","3","2513","1276.0","1279","4358","2672.0","2648"
"org.openrewrite.java.migrate.util.SequencedCollection","5","3","2802","1528.0","1518","7632","3440.0","3355"
"org.openrewrite.java.migrate.UpgradePluginsForJava21","5","3","13437","11772.0","11328","11925","4848.0","4631"
"org.openrewrite.java.migrate.CastArraysAsListToList","5","3","0","0.0","0","6387","3320.0","3299"
"org.openrewrite.java.migrate.JREWrapperInterface","5","3","4751","3068.0","2957","3589","1400.0","1362"
"org.openrewrite.java.migrate.net.MigrateMulticastSocketSetTTLToSetTimeToLive","5","3","0","0.0","0","5620","2556.0","2505"
"org.openrewrite.java.migrate.UpgradeBuildToJava21","5","3","3608","1840.0","1800","2584","1336.0","1305"
"org.openrewrite.maven.UpgradePluginVersion","5","3","0","0.0","0","1232833","262142.0","256274"
"org.openrewrite.java.migrate.UpgradePluginsForJava17","5","3","2485","1532.0","1511","3275","1648.0","1645"
"org.openrewrite.java.migrate.UpgradePluginsForJava11","5","3","2741","1468.0","1469","9015","3568.0","3515"
"org.openrewrite.java.migrate.util.OptionalStreamRecipe","5","3","0","0.0","0","3875","1724.0","1719"
"org.openrewrite.java.migrate.lang.MigrateRuntimeVersionSecurityToUpdate","5","3","4368","3324.0","3298","4308","1264.0","1240"
"org.openrewrite.java.migrate.lang.SwitchCaseReturnsToSwitchExpression","5","3","0","0.0","0","647167","491516.0","477510"
"org.openrewrite.java.migrate.Java8toJava11","5","3","9138","7164.0","7021","3527","1520.0","1512"
"org.openrewrite.java.migrate.net.MigrateHttpURLConnectionHttpServerErrorToHttpInternalError","5","3","0","0.0","0","17534","10224.0","10225"
"org.openrewrite.java.migrate.ReplaceAWTGetPeerMethod","5","3","0","0.0","0","3109","1276.0","1230"
"org.openrewrite.java.migrate.lang.ExplicitRecordImport","5","3","0","0.0","0","372211","311280.0","308856"
"org.openrewrite.scala.migrate.UpgradeScala_2_12","5","3","2504","1468.0","1409","5602","2928.0","2830"
"org.openrewrite.java.migrate.RemovedModifierAndConstantBootstrapsConstructors","5","3","2221","1404.0","1375","5863","2672.0","2613"
"org.openrewrite.java.migrate.javax.JavaxXmlStreamAPIs","5","3","10633","6136.0","6138","7174","3056.0","2951"
"org.openrewrite.java.migrate.RemovedSecurityManagerMethods","5","3","0","0.0","0","266932","204792.0","200613"
"org.openrewrite.maven.RemoveManagedDependency","5","3","0","0.0","0","124257","90108.0","87622"
"org.openrewrite.java.migrate.RemovedToolProviderConstructor","5","3","3426","1916.0","1882","6073","2544.0","2516"
"org.openrewrite.java.migrate.MXBeanRule","5","3","0","0.0","0","286865","155640.0","153484"
"org.openrewrite.java.migrate.concurrent.MigrateAtomicLongArrayWeakCompareAndSetToWeakCompareAndSetPlain","5","3","5155","3836.0","3835","5832","2160.0","2138"
"org.openrewrite.java.migrate.RemovedRuntimeTraceMethods","5","3","3628","1656.0","1602","7534","3440.0","3379"
"org.openrewrite.java.migrate.concurrent.MigrateAtomicReferenceArrayWeakCompareAndSetToWeakCompareAndSetPlain","5","3","4048","3068.0","2955","5424","1912.0","1882"
"org.openrewrite.java.migrate.lang.MigrateRuntimeVersionMinorToInterim","5","3","3978","3068.0","2970","3338","1336.0","1291"
"org.openrewrite.staticanalysis.ReplaceDeprecatedRuntimeExecMethods","5","3","0","0.0","0","221856","147452.0","146144"
"org.openrewrite.java.RemoveMethodInvocations","5","3","0","0.0","0","133142","63484.0","63272"
"org.openrewrite.java.migrate.DeprecatedLogRecordThreadID","5","3","2357","1404.0","1376","5295","3184.0","3072"
"org.openrewrite.java.migrate.net.JavaNetAPIs","5","3","5976","4088.0","4003","24432","19424.0","18500"
"org.openrewrite.java.ChangeMethodAccessLevel","5","3","0","0.0","0","21175","9212.0","9131"
"org.openrewrite.java.migrate.javax.AddJaxwsRuntime","5","3","0","0.0","0","1216","540.0","531"
"org.openrewrite.github.SetupJavaUpgradeJavaVersion","5","3","0","0.0","0","12189","1968.0","1927"
"org.openrewrite.java.migrate.AddLombokMapstructBinding","5","3","36208","24512.0","24312","3900","2160.0","2118"
"org.openrewrite.java.migrate.RemovedLegacySunJSSEProviderName","5","3","2189","1340.0","1320","6669","2928.0","2929"
"org.openrewrite.java.migrate.util.OptionalNotEmptyToIsPresent","5","3","0","0.0","0","30879","15868.0","15626"
"org.openrewrite.java.migrate.DeprecatedCountStackFramesMethod","5","3","2151","1276.0","1269","6631","3056.0","2980"
"org.openrewrite.java.migrate.JREThrowableFinalMethods","5","3","0","0.0","0","47231","40952.0","39216"
"org.openrewrite.java.migrate.ReplaceLocalizedStreamMethods","5","3","0","0.0","0","141807","90110.0","86352"
"org.openrewrite.staticanalysis.BigDecimalRoundingConstantsToEnums","5","3","0","0.0","0","106828","81904.0","79259"
"org.openrewrite.java.migrate.javax.MigrateElementKindVisitor6To9","5","3","3430","1404.0","1365","3908","1328.0","1326"
"org.openrewrite.gradle.AddDependency","5","3","79855","25088.0","25207","24738","9600.0","9292"
"org.openrewrite.java.migrate.UpgradeJavaVersion","5","3","0","0.0","0","1553209","458748.0","451999"
"org.openrewrite.java.migrate.lang.MigrateClassNewInstanceToGetDeclaredConstructorNewInstance","5","3","0","0.0","0","34535","24568.0","24355"
"org.openrewrite.java.migrate.util.ReplaceMathRandomWithThreadLocalRandomRecipe","5","3","0","0.0","0","25425","18424.0","18273"
"org.openrewrite.java.migrate.UpdateJakartaAnnotationsIfForJavax","5","3","1181066","1113088.0","1054562","3009","1584.0","1551"
"org.openrewrite.java.dependencies.RemoveDependency","5","3","69388","55232.0","54403","1247935","1113856.0","1064416"
"org.openrewrite.java.ChangePackage","5","3","0","0.0","0","1542030","655358.0","655183"
"org.openrewrite.java.migrate.lombok.LombokOnXToOnX_","5","3","0","0.0","0","32827","22512.0","22092"
"org.openrewrite.staticanalysis.PrimitiveWrapperClassConstructorToValueOf","5","3","0","0.0","0","122845","77816.0","74682"
"org.openrewrite.staticanalysis.InstanceOfPatternMatch","5","3","0","0.0","0","389025","253944.0","253276"
"org.openrewrite.java.migrate.SunNetSslPackageUnavailable","5","3","2331","1468.0","1470","2811","1400.0","1395"
"org.openrewrite.java.migrate.cobertura.RemoveCoberturaMavenPlugin","5","3","3132","1276.0","1260","3711","1584.0","1555"
"org.openrewrite.java.migrate.RemovedZipFinalizeMethods","5","3","2688","1852.0","1794","4653","2032.0","2045"
"org.openrewrite.java.migrate.UpdateJakartaAnnotationsIfExistsForJakarta","5","3","253434","187904.0","186533","5444","1952.0","1932"
"org.openrewrite.java.migrate.RemovedPolicy","5","3","3694","2812.0","2765","6308","2544.0","2524"
"org.openrewrite.java.migrate.javax.MigrateXMLInputFactoryNewInstanceToNewFactory","5","3","2540","1532.0","1532","5927","2808.0","2705"
"org.openrewrite.java.migrate.net.URLConstructorToURICreate","5","3","0","0.0","0","198990","139248.0","135905"
"org.openrewrite.java.migrate.lang.MigrateRuntimeVersionMajorToFeature","5","3","4492","3452.0","3422","3982","1456.0","1413"
"org.openrewrite.java.migrate.ArrayStoreExceptionToTypeNotPresentException","5","3","0","0.0","0","8846","5372.0","5287"
"org.openrewrite.java.migrate.jacoco.UpgradeJaCoCo","5","3","5352","2928.0","2817","2852","1336.0","1308"
"org.openrewrite.java.migrate.UseJavaUtilBase64","5","3","0","0.0","0","61507","31736.0","31739"
"org.openrewrite.java.migrate.concurrent.MigrateAtomicBooleanWeakCompareAndSetToWeakCompareAndSetPlain","5","3","5645","3964.0","3864","5115","2160.0","2095"
"org.openrewrite.java.migrate.javax.MigrateAbstractElementVisitor6To9","5","3","3126","2044.0","1994","4181","1520.0","1482"
"org.openrewrite.java.dependencies.UpgradeDependencyVersion","5","3","10022155","4455936.0","4418860","255232759","2.51657984E8","249217347"
"org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion","5","3","0","0.0","0","4742241","2359294.0","2340724"
"org.openrewrite.java.migrate.javax.MigrateSimpleElementVisitor6To9","5","3","2700","1788.0","1729","4485","1720.0","1719"
"org.openrewrite.java.dependencies.AddDependency","5","3","16027819","9436672.0","9107253","13825372","1.3631232E7","13183167"
"org.openrewrite.java.migrate.logging.JavaLoggingAPIs","5","3","4335","2940.0","2855","6772","2800.0","2704"
"org.openrewrite.java.migrate.javax.AddInjectDependencies","5","3","21146","13296.0","12892","27573","20464.0","20459"
"org.openrewrite.java.migrate.logging.MigrateLoggerGlobalToGetGlobal","5","3","0","0.0","0","30917","14832.0","14727"
"org.openrewrite.java.migrate.concurrent.MigrateAtomicIntegerArrayWeakCompareAndSetToWeakCompareAndSetPlain","5","3","8346","5116.0","4963","5242","2160.0","2121"
"org.openrewrite.java.migrate.DeprecatedJavaxSecurityCert","5","3","2512","1336.0","1321","11468","4832.0","4760"
"org.openrewrite.java.migrate.javax.JavaxLangModelUtil","5","3","5747","4092.0","3990","4530","1952.0","1962"
"org.openrewrite.jenkins.UpgradeJavaVersion","5","3","142108","77808.0","75888","326338","179968.0","176130"
"org.openrewrite.maven.AddDependency","5","3","289471","278464.0","268563","12857","4288.0","4116"
"org.openrewrite.java.migrate.BouncyCastleFromJdk15OnToJdk15to18","5","3","5392","3580.0","3497","9105","3168.0","3091"
"org.openrewrite.java.migrate.lang.MigrateClassLoaderDefineClass","5","3","0","0.0","0","319005","172028.0","167852"
"org.openrewrite.java.migrate.javax.JavaxManagementMonitorAPIs","5","3","3204","1592.0","1578","3935","1584.0","1551"
"org.openrewrite.java.migrate.lang.JavaLangAPIs","5","3","4424","3452.0","3386","10458","4080.0","4004"
"org.openrewrite.java.migrate.IllegalArgumentExceptionToAlreadyConnectedException","5","3","0","0.0","0","5045","3196.0","3082"
"org.openrewrite.java.migrate.DeleteDeprecatedFinalize","5","3","5419","2680.0","2666","8044","3312.0","3283"
"org.openrewrite.java.migrate.Jre17AgentMainPreMainPublic","5","3","2148","1276.0","1279","5677","3056.0","2966"
"org.openrewrite.java.migrate.nio.file.PathsGetToPathOf","5","3","7991","4344.0","4123","11266","7152.0","7011"
"org.openrewrite.java.migrate.RemovedSSLSessionGetPeerCertificateChainMethodImpl","5","3","2572","1660.0","1618","3146","1592.0","1557"
"org.openrewrite.java.ChangeMethodName","5","3","0","0.0","0","3144644","229372.0","231494"
"org.openrewrite.java.migrate.lombok.UpdateLombokToJava11","5","3","4234","2808.0","2743","6247","2416.0","2388"
"org.openrewrite.java.migrate.javax.AddCommonAnnotationsDependencies","5","3","16062","8696.0","8690","14332","11768.0","11604"
"org.openrewrite.java.migrate.net.MigrateURLDecoderDecode","5","3","0","0.0","0","16688","10236.0","9743"
"org.openrewrite.java.migrate.util.OptionalNotPresentToIsEmpty","5","3","0","0.0","0","250720","147448.0","144470"
"org.openrewrite.java.migrate.ReferenceCloneMethod","5","3","0","0.0","0","5004","2168.0","2084"
"org.openrewrite.java.migrate.javax.AddJaxbDependenciesWithRuntime","5","3","10848","5112.0","5114","8541","3168.0","3182"
"org.openrewrite.java.migrate.sql.JavaSqlAPIs","5","3","3967","2812.0","2798","6177","2288.0","2238"
"org.openrewrite.java.migrate.RemovedSubjectMethods","5","3","3653","2556.0","2531","4146","1968.0","1922"
"org.openrewrite.java.migrate.AddMissingMethodImplementation","5","3","0","0.0","0","619468","229368.0","221749"
"org.openrewrite.java.migrate.util.IteratorNext","5","3","0","0.0","0","20103","10744.0","10263"
"org.openrewrite.maven.UseMavenCompilerPluginReleaseConfiguration","5","3","0","0.0","0","195078","73724.0","71210"
"org.openrewrite.java.migrate.util.StreamFindFirst","5","3","0","0.0","0","13848","7164.0","7049"
"org.openrewrite.java.migrate.ThreadStopDestroy","5","3","2436","1468.0","1449","3924","1776.0","1761"
"org.openrewrite.java.migrate.concurrent.MigrateAtomicLongWeakCompareAndSetToWeakCompareAndSetPlain","5","3","6022","4860.0","4830","7024","2544.0","2537"
"org.openrewrite.java.migrate.BounceCastleFromJdk15OntoJdk18On","5","3","6576","3452.0","3413","9269","4336.0","4243"
"org.openrewrite.staticanalysis.RemoveExtraSemicolons","5","3","0","0.0","0","281228","147452.0","144433"
"org.openrewrite.java.migrate.javax.MigrateXMLOutputFactoryNewInstanceToNewFactory","5","3","2264","1340.0","1338","5860","2288.0","2214"
"org.openrewrite.java.migrate.javax.MigrateSimpleTypeVisitor6To9","5","3","3182","2300.0","2241","3855","1400.0","1371"
"org.openrewrite.java.ChangeMethodTargetToStatic","5","3","0","0.0","0","239772","196604.0","189393"
"org.openrewrite.java.migrate.javax.MigrateElementScanner6To9","5","3","2769","1660.0","1644","4104","1392.0","1353"
"org.openrewrite.java.ChangeType","5","3","0","0.0","0","5219959","688064.0","683613"
"org.openrewrite.maven.RemovePlugin","5","3","0","0.0","0","361976","360432.0","356924"
"org.openrewrite.java.migrate.lang.MigrateCharacterIsJavaLetterToIsJavaIdentifierStart","5","3","4494","3452.0","3349","4364","2168.0","2059"
"org.openrewrite.java.migrate.javax.AddJaxwsDependencies","5","3","15703","6080.0","6026","11757","4848.0","4770"
"org.openrewrite.java.migrate.javax.AddJaxbAPIDependencies","5","3","5822","3576.0","3473","39086","36848.0","35349"
"org.openrewrite.java.migrate.lang.UseTextBlocks","5","3","0","0.0","0","288122","172028.0","171248"
"org.openrewrite.java.migrate.lang.MigrateCharacterIsJavaLetterOrDigitToIsJavaIdentifierPart","5","3","4595","3324.0","3312","4210","1456.0","1421"
"org.openrewrite.java.migrate.logging.MigrateLogRecordSetMillisToSetInstant","5","3","0","0.0","0","7562","4860.0","4625"
"org.openrewrite.java.migrate.util.UseLocaleOf","5","3","0","0.0","0","22248","11260.0","11197"

target/rewrite/datatables/2025-09-14_12-06-17-070/org.openrewrite.table.SourcesFileResults.csv

"Source path before the run","Source path after the run","Parent of the recipe that made changes","Recipe that made changes","Estimated time saving","Cycle"
"The source path of the file before the run. `null` when a source file was created during the run.","A recipe may modify the source path. This is the path after the run. `null` when a source file was deleted during the run.","In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all.","The specific recipe that made a change.","An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds.","The recipe cycle in which the change was made."
"pom.xml","pom.xml","org.openrewrite.java.migrate.javax.AddInjectDependencies","org.openrewrite.java.dependencies.AddDependency","300","1"
"pom.xml","pom.xml","org.openrewrite.java.migrate.Java8toJava11","org.openrewrite.java.migrate.javax.AddInjectDependencies","300","1"
"pom.xml","pom.xml","org.openrewrite.java.migrate.UpgradeToJava17","org.openrewrite.java.migrate.Java8toJava11","300","1"
"pom.xml","pom.xml","","org.openrewrite.java.migrate.UpgradeToJava17","300","1"
"pom.xml","pom.xml","org.openrewrite.java.migrate.UpgradeJavaVersion","org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion","300","1"
"pom.xml","pom.xml","org.openrewrite.java.migrate.UpgradeBuildToJava11","org.openrewrite.java.migrate.UpgradeJavaVersion","300","1"
"pom.xml","pom.xml","org.openrewrite.java.migrate.Java8toJava11","org.openrewrite.java.migrate.UpgradeBuildToJava11","300","1"
"pom.xml","pom.xml","org.openrewrite.java.migrate.UpgradeToJava17","org.openrewrite.java.migrate.Java8toJava11","300","1"
"pom.xml","pom.xml","","org.openrewrite.java.migrate.UpgradeToJava17","300","1"
"pom.xml","pom.xml","org.openrewrite.java.migrate.UpgradeJavaVersion","org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion","300","1"
"pom.xml","pom.xml","org.openrewrite.java.migrate.UpgradeBuildToJava17","org.openrewrite.java.migrate.UpgradeJavaVersion","300","1"
"pom.xml","pom.xml","org.openrewrite.java.migrate.UpgradeToJava17","org.openrewrite.java.migrate.UpgradeBuildToJava17","300","1"
"pom.xml","pom.xml","","org.openrewrite.java.migrate.UpgradeToJava17","300","1"
"pom.xml","pom.xml","org.openrewrite.java.migrate.UpgradeJavaVersion","org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion","300","1"
"pom.xml","pom.xml","org.openrewrite.java.migrate.UpgradeBuildToJava21","org.openrewrite.java.migrate.UpgradeJavaVersion","300","1"
"pom.xml","pom.xml","","org.openrewrite.java.migrate.UpgradeBuildToJava21","300","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","org.openrewrite.java.migrate.UpgradeBuildToJava11","org.openrewrite.java.migrate.UpgradeJavaVersion","0","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","org.openrewrite.java.migrate.Java8toJava11","org.openrewrite.java.migrate.UpgradeBuildToJava11","0","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","org.openrewrite.java.migrate.UpgradeToJava17","org.openrewrite.java.migrate.Java8toJava11","0","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","","org.openrewrite.java.migrate.UpgradeToJava17","0","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","org.openrewrite.java.migrate.UpgradeBuildToJava17","org.openrewrite.java.migrate.UpgradeJavaVersion","0","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","org.openrewrite.java.migrate.UpgradeToJava17","org.openrewrite.java.migrate.UpgradeBuildToJava17","0","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","","org.openrewrite.java.migrate.UpgradeToJava17","0","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","org.openrewrite.java.migrate.UpgradeToJava17","org.openrewrite.java.migrate.lang.StringFormatted","60","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","","org.openrewrite.java.migrate.UpgradeToJava17","60","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","org.openrewrite.java.migrate.UpgradeBuildToJava21","org.openrewrite.java.migrate.UpgradeJavaVersion","0","1"
"src/main/java/org/littlewings/openrewrite/MessageService.java","src/main/java/org/littlewings/openrewrite/MessageService.java","","org.openrewrite.java.migrate.UpgradeBuildToJava21","0","1"
"src/main/java/org/littlewings/openrewrite/HelloResource.java","src/main/java/org/littlewings/openrewrite/HelloResource.java","org.openrewrite.java.migrate.UpgradeBuildToJava11","org.openrewrite.java.migrate.UpgradeJavaVersion","0","1"
"src/main/java/org/littlewings/openrewrite/HelloResource.java","src/main/java/org/littlewings/openrewrite/HelloResource.java","org.openrewrite.java.migrate.Java8toJava11","org.openrewrite.java.migrate.UpgradeBuildToJava11","0","1"
"src/main/java/org/littlewings/openrewrite/HelloResource.java","src/main/java/org/littlewings/openrewrite/HelloResource.java","org.openrewrite.java.migrate.UpgradeToJava17","org.openrewrite.java.migrate.Java8toJava11","0","1"
"src/main/java/org/littlewings/openrewrite/HelloResource.java","src/main/java/org/littlewings/openrewrite/HelloResource.java","","org.openrewrite.java.migrate.UpgradeToJava17","0","1"
"src/main/java/org/littlewings/openrewrite/HelloResource.java","src/main/java/org/littlewings/openrewrite/HelloResource.java","org.openrewrite.java.migrate.UpgradeBuildToJava17","org.openrewrite.java.migrate.UpgradeJavaVersion","0","1"
"src/main/java/org/littlewings/openrewrite/HelloResource.java","src/main/java/org/littlewings/openrewrite/HelloResource.java","org.openrewrite.java.migrate.UpgradeToJava17","org.openrewrite.java.migrate.UpgradeBuildToJava17","0","1"
"src/main/java/org/littlewings/openrewrite/HelloResource.java","src/main/java/org/littlewings/openrewrite/HelloResource.java","","org.openrewrite.java.migrate.UpgradeToJava17","0","1"
"src/main/java/org/littlewings/openrewrite/HelloResource.java","src/main/java/org/littlewings/openrewrite/HelloResource.java","org.openrewrite.java.migrate.UpgradeBuildToJava21","org.openrewrite.java.migrate.UpgradeJavaVersion","0","1"
"src/main/java/org/littlewings/openrewrite/HelloResource.java","src/main/java/org/littlewings/openrewrite/HelloResource.java","","org.openrewrite.java.migrate.UpgradeBuildToJava21","0","1"

変更を反映します。

$ mvn rewrite:run

実行ログ。

[INFO] --- rewrite:6.18.0:run (default-cli) @ openrewrite-example ---
[INFO] Using active recipe(s) [org.openrewrite.java.migrate.UpgradeToJava21]
[INFO] Using active styles(s) []
[INFO] Validating active recipes...
[INFO] Project [openrewrite-example] Resolving Poms...
[INFO] Project [openrewrite-example] Parsing source files
[INFO] Running recipe(s)...
[INFO] Printing available datatables to: target/rewrite/datatables/2025-09-14_12-08-33-642
[WARNING] Changes have been made to pom.xml by:
[WARNING]     org.openrewrite.java.migrate.UpgradeToJava17
[WARNING]         org.openrewrite.java.migrate.Java8toJava11
[WARNING]             org.openrewrite.java.migrate.javax.AddInjectDependencies
[WARNING]                 org.openrewrite.java.dependencies.AddDependency: {groupId=jakarta.inject, artifactId=jakarta.inject-api, version=1.0.3, onlyIfUsing=javax.inject.*, acceptTransitive=true}
[WARNING]             org.openrewrite.java.migrate.UpgradeBuildToJava11
[WARNING]                 org.openrewrite.java.migrate.UpgradeJavaVersion: {version=11}
[WARNING]                     org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion: {version=11}
[WARNING]         org.openrewrite.java.migrate.UpgradeBuildToJava17
[WARNING]             org.openrewrite.java.migrate.UpgradeJavaVersion: {version=17}
[WARNING]                 org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion: {version=17}
[WARNING]         org.openrewrite.java.migrate.UpgradeBuildToJava21
[WARNING]             org.openrewrite.java.migrate.UpgradeJavaVersion: {version=21}
[WARNING]                 org.openrewrite.maven.UpdateMavenProjectPropertyJavaVersion: {version=21}
[WARNING] Changes have been made to src/main/java/org/littlewings/openrewrite/MessageService.java by:
[WARNING]     org.openrewrite.java.migrate.UpgradeToJava17
[WARNING]         org.openrewrite.java.migrate.Java8toJava11
[WARNING]             org.openrewrite.java.migrate.UpgradeBuildToJava11
[WARNING]                 org.openrewrite.java.migrate.UpgradeJavaVersion: {version=11}
[WARNING]         org.openrewrite.java.migrate.UpgradeBuildToJava17
[WARNING]             org.openrewrite.java.migrate.UpgradeJavaVersion: {version=17}
[WARNING]         org.openrewrite.java.migrate.lang.StringFormatted: {addParentheses=false}
[WARNING]         org.openrewrite.java.migrate.UpgradeBuildToJava21
[WARNING]             org.openrewrite.java.migrate.UpgradeJavaVersion: {version=21}
[WARNING] Please review and commit the results.
[WARNING] Estimate time saved: 5m

差分を確認。

$ git diff
diff --git a/pom.xml b/pom.xml
index d798cc5..5bbfd96 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,6 +16,11 @@
     </properties>

     <dependencies>
+        <dependency>
+            <groupId>jakarta.inject</groupId>
+            <artifactId>jakarta.inject-api</artifactId>
+            <version>1.0.3</version>
+        </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
@@ -74,7 +79,7 @@
                 <configuration>
                     <exportDatatables>true</exportDatatables>
                     <activeRecipes>
-                        <recipe>org.openrewrite.java.migrate.UpgradeBuildToJava21</recipe>
+                        <recipe>org.openrewrite.java.migrate.UpgradeToJava21</recipe>
                     </activeRecipes>
                 </configuration>
                 <dependencies>
diff --git a/src/main/java/org/littlewings/openrewrite/MessageService.java b/src/main/java/org/littlewings/openrewrite/MessageService.java
index 58122e9..c7f4d2a 100644
--- a/src/main/java/org/littlewings/openrewrite/MessageService.java
+++ b/src/main/java/org/littlewings/openrewrite/MessageService.java
@@ -5,6 +5,6 @@ import javax.enterprise.context.ApplicationScoped;
 @ApplicationScoped
 public class MessageService {
     public String star(String message) {
-        return String.format("★★★%s★★★", message);
+        return "★★★%s★★★".formatted(message);
     }
 }

コンパイルできることを確認しておきます。

$ mvn clean compile

では、ここまででコミットしておきましょう。

$ git add pom.xml src
$ git commit -m 'upgrade to Java 21'
Java EE 8からJakarta EE 10に移行する

最後にJava EE 8からJakarta EE 10に移行します。

Migrate to Jakarta EE 10 | OpenRewrite Docs

レシピにorg.openrewrite.java.migrate.jakarta.JakartaEE10を追加。

                    <activeRecipes>
                        <recipe>org.openrewrite.java.migrate.UpgradeToJava21</recipe>
                        <recipe>org.openrewrite.java.migrate.jakarta.JakartaEE10</recipe>
                    </activeRecipes>

rewrite:dryRunしてみます。

$ mvn clean rewrite:dryRun

実行ログ。

[INFO] --- rewrite:6.18.0:dryRun (default-cli) @ openrewrite-example ---
[INFO] Using active recipe(s) [org.openrewrite.java.migrate.UpgradeToJava21, org.openrewrite.java.migrate.jakarta.JakartaEE10]
[INFO] Using active styles(s) []
[INFO] Validating active recipes...
[INFO] Project [openrewrite-example] Resolving Poms...
[INFO] Project [openrewrite-example] Parsing source files
[INFO] Running recipe(s)...
[INFO] Printing available datatables to: target/rewrite/datatables/2025-09-14_12-11-33-998
[WARNING] These recipes would make changes to pom.xml:
[WARNING]     org.openrewrite.java.migrate.jakarta.JakartaEE10
[WARNING]         org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxDecoratorToJakartaDecorator
[WARNING]                 org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=javax.enterprise, oldArtifactId=cdi-api, newGroupId=jakarta.enterprise, newArtifactId=jakarta.enterprise.cdi-api, newVersion=3.0.x}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxInjectMigrationToJakartaInject
[WARNING]                 org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=javax.inject, oldArtifactId=javax.inject, newGroupId=jakarta.inject, newArtifactId=jakarta.inject-api, newVersion=2.0.x}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxServletToJakartaServlet
[WARNING]                 org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=javax.servlet, oldArtifactId=javax.servlet-api, newGroupId=jakarta.servlet, newArtifactId=jakarta.servlet-api, newVersion=5.0.x}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxWsToJakartaWs
[WARNING]                 org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=javax.ws.rs, oldArtifactId=javax.ws.rs-api, newGroupId=jakarta.ws.rs, newArtifactId=jakarta.ws.rs-api, newVersion=3.0.x}
[WARNING]                 org.openrewrite.java.dependencies.AddDependency: {groupId=jakarta.ws.rs, artifactId=jakarta.ws.rs-api, version=3.0.x, onlyIfUsing=javax.ws.rs.core.*}
[WARNING]         org.openrewrite.java.migrate.jakarta.MigrationToJakarta10Apis
[WARNING]             org.openrewrite.java.dependencies.UpgradeDependencyVersion: {groupId=jakarta.enterprise, artifactId=jakarta.enterprise.cdi-api, newVersion=4.0.x}
[WARNING]             org.openrewrite.java.dependencies.UpgradeDependencyVersion: {groupId=jakarta.servlet, artifactId=jakarta.servlet-api, newVersion=6.0.x}
[WARNING]             org.openrewrite.java.dependencies.UpgradeDependencyVersion: {groupId=jakarta.ws.rs, artifactId=jakarta.ws.rs-api, newVersion=3.1.x}
[WARNING] These recipes would make changes to src/main/java/org/littlewings/openrewrite/MessageService.java:
[WARNING]     org.openrewrite.java.migrate.jakarta.JakartaEE10
[WARNING]         org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxEnterpriseToJakartaEnterprise
[WARNING]                 org.openrewrite.java.ChangePackage: {oldPackageName=javax.enterprise, newPackageName=jakarta.enterprise, recursive=true}
[WARNING] These recipes would make changes to src/main/java/org/littlewings/openrewrite/HelloResource.java:
[WARNING]     org.openrewrite.java.migrate.jakarta.JakartaEE10
[WARNING]         org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxEnterpriseToJakartaEnterprise
[WARNING]                 org.openrewrite.java.ChangePackage: {oldPackageName=javax.enterprise, newPackageName=jakarta.enterprise, recursive=true}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxInjectMigrationToJakartaInject
[WARNING]                 org.openrewrite.java.ChangePackage: {oldPackageName=javax.inject, newPackageName=jakarta.inject, recursive=true}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxWsToJakartaWs
[WARNING]                 org.openrewrite.java.ChangePackage: {oldPackageName=javax.ws, newPackageName=jakarta.ws, recursive=true}
[WARNING] These recipes would make changes to src/main/webapp/WEB-INF/web.xml:
[WARNING]     org.openrewrite.java.migrate.jakarta.JakartaEE10
[WARNING]         org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
[WARNING]             org.openrewrite.java.migrate.jakarta.Faces2xMigrationToJakartaFaces3x
[WARNING]                 org.openrewrite.java.migrate.jakarta.JavaxWebXmlToJakartaWebXml
[WARNING]                     org.openrewrite.xml.ChangeTagAttribute: {elementName=web-app, attributeName=version, newValue=5.0}
[WARNING]                     org.openrewrite.xml.ChangeTagAttribute: {elementName=web-app, attributeName=xmlns, newValue=https://jakarta.ee/xml/ns/jakartaee}
[WARNING]                     org.openrewrite.xml.ChangeTagAttribute: {elementName=web-app, attributeName=xsi:schemaLocation, newValue=https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd}
[WARNING]                     org.openrewrite.text.FindAndReplace: {find=javax., replace=jakarta., filePattern=**/web.xml}
[WARNING] Patch file available:
[WARNING]     /path/to/target/rewrite/rewrite.patch
[WARNING] Estimate time saved: 20m
[WARNING] Run 'mvn rewrite:run' to apply the recipes.

すごいことになりました…。

パッチファイルを見てみます。

target/rewrite/rewrite.patch

diff --git a/pom.xml b/pom.xml
index 6685753..cb1f04b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,26 +22,31 @@ org.openrewrite.config.CompositeRecipe
             <version>1.0.3</version>
         </dependency>
         <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <version>6.0.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.ws.rs</groupId>
+            <artifactId>jakarta.ws.rs-api</artifactId>
             <version>3.1.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>javax.ws.rs</groupId>
-            <artifactId>javax.ws.rs-api</artifactId>
-            <version>2.1.1</version>
-            <scope>provided</scope>
+            <groupId>jakarta.enterprise</groupId>
+            <artifactId>jakarta.enterprise.cdi-api</artifactId>
+            <version>4.0.1</version>
         </dependency>
         <dependency>
-            <groupId>javax.enterprise</groupId>
-            <artifactId>cdi-api</artifactId>
-            <version>2.0.SP1</version>
+            <groupId>jakarta.inject</groupId>
+            <artifactId>jakarta.inject-api</artifactId>
+            <version>2.0.1</version>
         </dependency>
         <dependency>
-            <groupId>javax.inject</groupId>
-            <artifactId>javax.inject</artifactId>
-            <version>1</version>
+            <groupId>jakarta.ws.rs</groupId>
+            <artifactId>jakarta.ws.rs-api</artifactId>
+            <version>3.1.0</version>
         </dependency>
     </dependencies>


diff --git a/src/main/java/org/littlewings/openrewrite/MessageService.java b/src/main/java/org/littlewings/openrewrite/MessageService.java
index c7f4d2a..b422eb4 100644
--- a/src/main/java/org/littlewings/openrewrite/MessageService.java
+++ b/src/main/java/org/littlewings/openrewrite/MessageService.java
@@ -1,6 +1,6 @@ org.openrewrite.config.CompositeRecipe
 package org.littlewings.openrewrite;

-import javax.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.context.ApplicationScoped;

 @ApplicationScoped
 public class MessageService {

diff --git a/src/main/java/org/littlewings/openrewrite/HelloResource.java b/src/main/java/org/littlewings/openrewrite/HelloResource.java
index 78a87bb..96ee553 100644
--- a/src/main/java/org/littlewings/openrewrite/HelloResource.java
+++ b/src/main/java/org/littlewings/openrewrite/HelloResource.java
@@ -1,12 +1,12 @@ org.openrewrite.config.CompositeRecipe
 package org.littlewings.openrewrite;

-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;

 import java.util.HashMap;
 import java.util.Map;

diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index b566ecc..7991fa9 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -1,14 +1,13 @@ org.openrewrite.config.CompositeRecipe
 <?xml version="1.0" encoding="utf-8"?>
-<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
-                             http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
-         version="4.0">
+         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
+         version="5.0">
     <servlet>
-        <servlet-name>javax.ws.rs.core.Application</servlet-name>
+        <servlet-name>jakarta.ws.rs.core.Application</servlet-name>
     </servlet>
     <servlet-mapping>
-        <servlet-name>javax.ws.rs.core.Application</servlet-name>
+        <servlet-name>jakarta.ws.rs.core.Application</servlet-name>
         <url-pattern>/api/*</url-pattern>
     </servlet-mapping>
 </web-app>

概ね予想通りなのですが、web.xmlのバージョンはJakarta EE 10であれば6.0なのでは…?と思いますが…。

データテーブルは長いので今回は省略しますが、ひとつファイルが増えていました。

target/rewrite/datatables/2025-09-14_12-11-33-998/org.openrewrite.table.SourcesFiles.csv

"Source path before the run","LST type","Character encoding"
"The source path of the file before the run.","The LST model type that the file is parsed as.","The detected character encoding of the file"
"src/main/webapp/WEB-INF/web.xml","PlainText","UTF-8"

変更を適用してみましょう。

$ mvn rewrite:run

実行ログ。

[INFO] --- rewrite:6.18.0:run (default-cli) @ openrewrite-example ---
[INFO] Using active recipe(s) [org.openrewrite.java.migrate.UpgradeToJava21, org.openrewrite.java.migrate.jakarta.JakartaEE10]
[INFO] Using active styles(s) []
[INFO] Validating active recipes...
[INFO] Project [openrewrite-example] Resolving Poms...
[INFO] Project [openrewrite-example] Parsing source files
[INFO] Running recipe(s)...
[INFO] Printing available datatables to: target/rewrite/datatables/2025-09-14_12-16-11-404
[WARNING] Changes have been made to pom.xml by:
[WARNING]     org.openrewrite.java.migrate.jakarta.JakartaEE10
[WARNING]         org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxDecoratorToJakartaDecorator
[WARNING]                 org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=javax.enterprise, oldArtifactId=cdi-api, newGroupId=jakarta.enterprise, newArtifactId=jakarta.enterprise.cdi-api, newVersion=3.0.x}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxInjectMigrationToJakartaInject
[WARNING]                 org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=javax.inject, oldArtifactId=javax.inject, newGroupId=jakarta.inject, newArtifactId=jakarta.inject-api, newVersion=2.0.x}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxServletToJakartaServlet
[WARNING]                 org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=javax.servlet, oldArtifactId=javax.servlet-api, newGroupId=jakarta.servlet, newArtifactId=jakarta.servlet-api, newVersion=5.0.x}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxWsToJakartaWs
[WARNING]                 org.openrewrite.java.dependencies.ChangeDependency: {oldGroupId=javax.ws.rs, oldArtifactId=javax.ws.rs-api, newGroupId=jakarta.ws.rs, newArtifactId=jakarta.ws.rs-api, newVersion=3.0.x}
[WARNING]                 org.openrewrite.java.dependencies.AddDependency: {groupId=jakarta.ws.rs, artifactId=jakarta.ws.rs-api, version=3.0.x, onlyIfUsing=javax.ws.rs.core.*}
[WARNING]         org.openrewrite.java.migrate.jakarta.MigrationToJakarta10Apis
[WARNING]             org.openrewrite.java.dependencies.UpgradeDependencyVersion: {groupId=jakarta.enterprise, artifactId=jakarta.enterprise.cdi-api, newVersion=4.0.x}
[WARNING]             org.openrewrite.java.dependencies.UpgradeDependencyVersion: {groupId=jakarta.servlet, artifactId=jakarta.servlet-api, newVersion=6.0.x}
[WARNING]             org.openrewrite.java.dependencies.UpgradeDependencyVersion: {groupId=jakarta.ws.rs, artifactId=jakarta.ws.rs-api, newVersion=3.1.x}
[WARNING] Changes have been made to src/main/java/org/littlewings/openrewrite/MessageService.java by:
[WARNING]     org.openrewrite.java.migrate.jakarta.JakartaEE10
[WARNING]         org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxEnterpriseToJakartaEnterprise
[WARNING]                 org.openrewrite.java.ChangePackage: {oldPackageName=javax.enterprise, newPackageName=jakarta.enterprise, recursive=true}
[WARNING] Changes have been made to src/main/java/org/littlewings/openrewrite/HelloResource.java by:
[WARNING]     org.openrewrite.java.migrate.jakarta.JakartaEE10
[WARNING]         org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxEnterpriseToJakartaEnterprise
[WARNING]                 org.openrewrite.java.ChangePackage: {oldPackageName=javax.enterprise, newPackageName=jakarta.enterprise, recursive=true}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxInjectMigrationToJakartaInject
[WARNING]                 org.openrewrite.java.ChangePackage: {oldPackageName=javax.inject, newPackageName=jakarta.inject, recursive=true}
[WARNING]             org.openrewrite.java.migrate.jakarta.JavaxWsToJakartaWs
[WARNING]                 org.openrewrite.java.ChangePackage: {oldPackageName=javax.ws, newPackageName=jakarta.ws, recursive=true}
[WARNING] Changes have been made to src/main/webapp/WEB-INF/web.xml by:
[WARNING]     org.openrewrite.java.migrate.jakarta.JakartaEE10
[WARNING]         org.openrewrite.java.migrate.jakarta.JavaxMigrationToJakarta
[WARNING]             org.openrewrite.java.migrate.jakarta.Faces2xMigrationToJakartaFaces3x
[WARNING]                 org.openrewrite.java.migrate.jakarta.JavaxWebXmlToJakartaWebXml
[WARNING]                     org.openrewrite.xml.ChangeTagAttribute: {elementName=web-app, attributeName=version, newValue=5.0}
[WARNING]                     org.openrewrite.xml.ChangeTagAttribute: {elementName=web-app, attributeName=xmlns, newValue=https://jakarta.ee/xml/ns/jakartaee}
[WARNING]                     org.openrewrite.xml.ChangeTagAttribute: {elementName=web-app, attributeName=xsi:schemaLocation, newValue=https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd}
[WARNING]                     org.openrewrite.text.FindAndReplace: {find=javax., replace=jakarta., filePattern=**/web.xml}
[WARNING] Please review and commit the results.
[WARNING] Estimate time saved: 20m

差分を確認。

$ git diff
diff --git a/pom.xml b/pom.xml
index 5bbfd96..cb1f04b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,26 +22,31 @@
             <version>1.0.3</version>
         </dependency>
         <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>3.1.0</version>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <version>6.0.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>javax.ws.rs</groupId>
-            <artifactId>javax.ws.rs-api</artifactId>
-            <version>2.1.1</version>
+            <groupId>jakarta.ws.rs</groupId>
+            <artifactId>jakarta.ws.rs-api</artifactId>
+            <version>3.1.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>javax.enterprise</groupId>
-            <artifactId>cdi-api</artifactId>
-            <version>2.0.SP1</version>
+            <groupId>jakarta.enterprise</groupId>
+            <artifactId>jakarta.enterprise.cdi-api</artifactId>
+            <version>4.0.1</version>
         </dependency>
         <dependency>
-            <groupId>javax.inject</groupId>
-            <artifactId>javax.inject</artifactId>
-            <version>1</version>
+            <groupId>jakarta.inject</groupId>
+            <artifactId>jakarta.inject-api</artifactId>
+            <version>2.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.ws.rs</groupId>
+            <artifactId>jakarta.ws.rs-api</artifactId>
+            <version>3.1.0</version>
         </dependency>
     </dependencies>

@@ -80,6 +85,7 @@
                     <exportDatatables>true</exportDatatables>
                     <activeRecipes>
                         <recipe>org.openrewrite.java.migrate.UpgradeToJava21</recipe>
+                        <recipe>org.openrewrite.java.migrate.jakarta.JakartaEE10</recipe>
                     </activeRecipes>
                 </configuration>
                 <dependencies>
diff --git a/src/main/java/org/littlewings/openrewrite/HelloResource.java b/src/main/java/org/littlewings/openrewrite/HelloResource.java
index 78a87bb..96ee553 100644
--- a/src/main/java/org/littlewings/openrewrite/HelloResource.java
+++ b/src/main/java/org/littlewings/openrewrite/HelloResource.java
@@ -1,12 +1,12 @@
 package org.littlewings.openrewrite;

-import javax.enterprise.context.ApplicationScoped;
-import javax.inject.Inject;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;

 import java.util.HashMap;
 import java.util.Map;
diff --git a/src/main/java/org/littlewings/openrewrite/MessageService.java b/src/main/java/org/littlewings/openrewrite/MessageService.java
index c7f4d2a..b422eb4 100644
--- a/src/main/java/org/littlewings/openrewrite/MessageService.java
+++ b/src/main/java/org/littlewings/openrewrite/MessageService.java
@@ -1,6 +1,6 @@
 package org.littlewings.openrewrite;

-import javax.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.context.ApplicationScoped;

 @ApplicationScoped
 public class MessageService {
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index b566ecc..7991fa9 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -1,14 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
-<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
-                             http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
-         version="4.0">
+         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
+         version="5.0">
     <servlet>
-        <servlet-name>javax.ws.rs.core.Application</servlet-name>
+        <servlet-name>jakarta.ws.rs.core.Application</servlet-name>
     </servlet>
     <servlet-mapping>
-        <servlet-name>javax.ws.rs.core.Application</servlet-name>
+        <servlet-name>jakarta.ws.rs.core.Application</servlet-name>
         <url-pattern>/api/*</url-pattern>
     </servlet-mapping>
 </web-app>

変更をコミットしておきます。

$ git add pom.xml src
$ git commit -m 'migrate to Jakarta EE 10'

実行して動作確認したいところですが、このままだと明らかにうまくいきません。WildFlyJakarta EE 10をサポートするバージョンに変更して
おきます。
WildFly 37でCargo Maven3 Pluginが動かなかったので36にしました…

            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven3-plugin</artifactId>
                <version>1.10.22</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>run</goal>
                            <goal>start</goal>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <container>
                        <containerId>wildfly36x</containerId>
                        <zipUrlInstaller>
                            <url>
                                https://github.com/wildfly/wildfly/releases/download/36.0.1.Final/wildfly-36.0.1.Final.zip
                            </url>
                        </zipUrlInstaller>
                    </container>
                </configuration>
            </plugin>

実行。

$ mvn clean package cargo:run

確認。

$ curl localhost:8080/api/hello
{"message":"★★★Hello World!!★★★"}


$ curl localhost:8080/api/hello?word=WildFly
{"message":"★★★Hello WildFly!!★★★"}

OKですね。

あとは気になるのでweb.xmlのバージョンを変更しておきます。

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                             https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
         version="6.0">
    <servlet>
        <servlet-name>jakarta.ws.rs.core.Application</servlet-name>
    </servlet>
    <servlet-mapping>
        <servlet-name>jakarta.ws.rs.core.Application</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
</web-app>

また、よくよく見るとpom.xmlの依存関係もちょっとおかしなことになっていたので(jakarta.inject-apijakarta.ws.rs-apiが2つある)

    <dependencies>
        <dependency>
            <groupId>jakarta.inject</groupId>
            <artifactId>jakarta.inject-api</artifactId>
            <version>1.0.3</version>
        </dependency>
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jakarta.enterprise</groupId>
            <artifactId>jakarta.enterprise.cdi-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>jakarta.inject</groupId>
            <artifactId>jakarta.inject-api</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <version>3.1.0</version>
        </dependency>
    </dependencies>

整理しておきました。

    <dependencies>
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jakarta.enterprise</groupId>
            <artifactId>jakarta.enterprise.cdi-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>jakarta.inject</groupId>
            <artifactId>jakarta.inject-api</artifactId>
            <version>2.0.1</version>
        </dependency>
    </dependencies>

手動で変更した差分。

$ git diff
diff --git a/pom.xml b/pom.xml
index 4ad73d4..ff8c826 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,11 +16,6 @@
     </properties>

     <dependencies>
-        <dependency>
-            <groupId>jakarta.inject</groupId>
-            <artifactId>jakarta.inject-api</artifactId>
-            <version>1.0.3</version>
-        </dependency>
         <dependency>
             <groupId>jakarta.servlet</groupId>
             <artifactId>jakarta.servlet-api</artifactId>
@@ -43,11 +38,6 @@
             <artifactId>jakarta.inject-api</artifactId>
             <version>2.0.1</version>
         </dependency>
-        <dependency>
-            <groupId>jakarta.ws.rs</groupId>
-            <artifactId>jakarta.ws.rs-api</artifactId>
-            <version>3.1.0</version>
-        </dependency>
     </dependencies>

     <build>
@@ -68,10 +58,10 @@
                 </executions>
                 <configuration>
                     <container>
-                        <containerId>wildfly26x</containerId>
+                        <containerId>wildfly36x</containerId>
                         <zipUrlInstaller>
                             <url>
-                                https://github.com/wildfly/wildfly/releases/download/26.1.3.Final/wildfly-26.1.3.Final.zip
+                                https://github.com/wildfly/wildfly/releases/download/36.0.1.Final/wildfly-36.0.1.Final.zip
                             </url>
                         </zipUrlInstaller>
                     </container>
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 7991fa9..a4653ab 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
-         version="5.0">
+         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
+                             https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
+         version="6.0">
     <servlet>
         <servlet-name>jakarta.ws.rs.core.Application</servlet-name>
     </servlet>

動作確認結果は省略します。

これで確認したいことはできたかなと。

最後に修正後の結果をまとめて載せておきます。

    <properties>
        <maven.compiler.release>21</maven.compiler.release>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jakarta.ws.rs</groupId>
            <artifactId>jakarta.ws.rs-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jakarta.enterprise</groupId>
            <artifactId>jakarta.enterprise.cdi-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>jakarta.inject</groupId>
            <artifactId>jakarta.inject-api</artifactId>
            <version>2.0.1</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>ROOT</finalName>
        <plugins>
            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven3-plugin</artifactId>
                <version>1.10.22</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>run</goal>
                            <goal>start</goal>
                            <goal>stop</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <container>
                        <containerId>wildfly36x</containerId>
                        <zipUrlInstaller>
                            <url>
                                https://github.com/wildfly/wildfly/releases/download/36.0.1.Final/wildfly-36.0.1.Final.zip
                            </url>
                        </zipUrlInstaller>
                    </container>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.openrewrite.maven</groupId>
                <artifactId>rewrite-maven-plugin</artifactId>
                <version>6.18.0</version>
                <configuration>
                    <exportDatatables>true</exportDatatables>
                    <activeRecipes>
                        <recipe>org.openrewrite.java.migrate.UpgradeToJava21</recipe>
                        <recipe>org.openrewrite.java.migrate.jakarta.JakartaEE10</recipe>
                    </activeRecipes>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.openrewrite.recipe</groupId>
                        <artifactId>rewrite-migrate-java</artifactId>
                        <version>3.17.0</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                             https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
         version="6.0">
    <servlet>
        <servlet-name>jakarta.ws.rs.core.Application</servlet-name>
    </servlet>
    <servlet-mapping>
        <servlet-name>jakarta.ws.rs.core.Application</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
</web-app>

src/main/java/org/littlewings/openrewrite/HelloResource.java

package org.littlewings.openrewrite;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.MediaType;

import java.util.HashMap;
import java.util.Map;

@ApplicationScoped
@Path("/hello")
public class HelloResource {
    @Inject
    private MessageService messageService;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Map<String, String> hello(@QueryParam("word") String word) {
        Map<String, String> response = new HashMap<>();
        String baseMessage = word != null ? "Hello " + word + "!!" : "Hello World!!";
        response.put("message", messageService.star(baseMessage));

        return response;
    }
}

src/main/java/org/littlewings/openrewrite/MessageService.java

package org.littlewings.openrewrite;

import jakarta.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class MessageService {
    public String star(String message) {
        return "★★★%s★★★".formatted(message);
    }
}

おわりに

リファクタリングツールOpenRewriteを、Java 21とJakarta EE 10への移行レシピで試してみました。

割と導入できますし、使い方も簡単でよかったですね。

こういうのは100%完璧…というか自分の意図と同じ結果になるとは限らないわけですが、それでもここまで自動化されていると
便利だなと思います。

レシピもたくさんあるので、使えるところでは使っていきたいですね。