Early Access 版の IBM Bob にて、Java モダナイズ特化機能が利用できるようになったので、実際に触ってみました。
注意
本記事の内容は 2026年1月21日時点 の機能に基づいています。
今後、仕様が変更される可能性があります。
サンプルアプリケーション
今回はこちらのサンプルアプリを使用します。
Open Liberty 向けに作成された Java 8 / Java EE 7 のWebアプリケーションで、選択したリゾート地の天気状況(気温、風速、視界など)を表示するサービスを提供します。
このアプリを、Java 8 → Java 25 にバージョンアップさせていきます。
Javaモダナイズ機能を使ってみる
Bob IDE を開くと、Workflows の中に Java modernization が追加されていることが確認できます。
Workflow を開始すると、まず以下がチェックされます:
- 現在のワークスペースが対象の Java プロジェクトか
- SDKMAN がインストールされているか
※ 現時点では日本語未対応の部分が多いようです。
分析(Analyze Project)を実行すると、プロジェクトスキャンの後、modernization type を選択できます。
今回は Java Upgrade → Target Java version: 25 を選択。
さらに、試験的に Java EE → Jakarta EE 自動移行 の機能がありますが、今回はオフにします。
ランタイムとしてLiberty を利用している場合、Zero Migration により、古い Java EE API でも継続利用できます。
OpenRewrite による自動修正 → AI エージェントによる追加修正へ
「Run Recipes」を押すと、OpenRewrite による自動修正が適用されます。
その後、Bob の AI エージェントがコードを読み取り、必要な修正タスク(ToDo リスト)を生成してくれます。
ここからは ToDo リストに従って修正していきます。
① sun.misc.Unsafe の削除
まずは、ModResortsEnv.java にて、sun.misc.Unsafe を全面削除し、内部API依存を解消していきます。
内部APIはJava 9 以降のモジュール境界で強く制限され、Java 25 でも利用が不安定/非推奨に近い扱いとなっています。
IBM Bob は以下の修正を自動で実施してくれました:
- フィールド取得を Unsafe+オフセット方式から、通常のリフレクション(setAccessible(true)→f.get())へ変更
- これに伴い、不要メソッド・不要インポートを削除してクラスを簡素化
修正後のコード:
package com.acme.modres.util;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.acme.common.EnvConfig;
public class ModResortsEnv {
private static final Logger logger = Logger.getLogger(ModResortsEnv.class.getName());
private EnvConfig envConfig;
public ModResortsEnv() {
logger.log(Level.INFO, "Modresorts environment configuration details");
envConfig = new EnvConfig();
}
public void reset() {
String adminEndpoint = getAdminEndpoint();
URL url = null;
try {
url = URI.create(adminEndpoint).toURL();
} catch (MalformedURLException e) {
e.printStackTrace();
}
HttpURLConnection con = null;
try {
con = (HttpURLConnection) url.openConnection();
HttpURLConnection http = (HttpURLConnection) con;
http.setRequestMethod("POST");
http.setDoOutput(true);
BufferedWriter httpRequestBodyWriter = new BufferedWriter(new OutputStreamWriter(con.getOutputStream(), "UTF-8"));
httpRequestBodyWriter.write("reset=true");
httpRequestBodyWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private String getAdminEndpoint() {
try {
Field f = EnvConfig.class.getDeclaredField("adminApiEndpoint");
f.setAccessible(true);
return (String) f.get(envConfig);
} catch (NoSuchFieldException | SecurityException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
// Test driver for class
public static void main(String args[]) {
}
}
② SecurityManager の削除
SecurityManager は Java 17 で非推奨となり、Java 18 以降では実質的に無効化されており、最新 Java では撤廃方向のようです。
今回扱うアプリはデモ用のため、実質的なセキュリティ機能はオフとなっていますが、将来互換性の観点で修正を実行するという判断になったようです。
IBM Bob は以下の修正を自動で実施してくれました:
- SecurityManager関連のコードを完全に削除
- メソッド処理を IO.println("Operation is executed"); のみを実行するシンプルな形へ変更
これにより、古い Java セキュリティ機構への依存を排除し、今後は アプリケーション/フレームワーク側の認可・検証(Jakarta Securityなど) を使ったセキュリティ設計へ移行できるよう改善されています。
修正後のコード:
package com.acme.modres.security;
public class Service {
public static final String OPERATION = "my-operation";
public void operation() {
// SecurityManager is deprecated and removed in modern Java versions
// Security checks should be implemented using modern security frameworks
IO.println("Operation is executed");
}
}
③ Raw Type の除去
次に、WeatherServlet.javaについて、Java 8 世代では許容されていた raw type の Hashtable を、Java 25 でもコンパイル警告なく使えるよう ジェネリクス付き Hashtable へ置換します。
IBM Bobによる修正内容:
setInitialContextPropsメソッド
Hashtable ht = new Hashtable();
↓
Hashtable<String, Object> ht = new Hashtable<>();
これで、IBM Bob が生成してくれた修正タスクを全て完了しました。
ビルド確認
修正タスク完了後、自動でビルド確認コマンドを実行してくれます:
mvn clean compile -q
ビルドエラーがないことを確認し、タスク完了通知が表示されます。

動作確認
最後に、アプリが正常に動作するか確認します。
mvn liberty:run
でLibertyサーバーを起動します。
http://localhost:9080/resorts/ にアクセスし、正常に動作していることを確認できました。
所感
Transformation Advisor や Migration Toolkitを用いた従来のモダナイズ方法と比較すると:
- 修正点の検出、OpenRewrite による自動修正は従来ツールでも可能、ただしツールの事前準備やドキュメント理解がほぼ不要のため、導入〜利用までの手間は IBM Bob が圧倒的に少ない
- エージェントによる追加修正は手動よりも圧倒的に工数が少ない(想定通りですが、やはり工数削減効果は大きく感じました)
- ワークフローが視覚的に整理されていて、初心者でも手をつけやすい
一方で、現時点では一部 UI が英語のみのため、英語が苦手なユーザーにはやや壁があるかもしれません。
今回はシンプルなアプリでしたが、より複雑な Java EE アプリや大規模モジュールでも試してみたいと思います。
本投稿をご覧いただき、ありがとうございました。









