5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IBM Bob で Java モダナイズ機能を試してみた

Last updated at Posted at 2026-01-21

Early Access 版の IBM Bob にて、Java モダナイズ特化機能が利用できるようになったので、実際に触ってみました。

注意
本記事の内容は 2026年1月21日時点 の機能に基づいています。
今後、仕様が変更される可能性があります。

サンプルアプリケーション

今回はこちらのサンプルアプリを使用します。
Open Liberty 向けに作成された Java 8 / Java EE 7 のWebアプリケーションで、選択したリゾート地の天気状況(気温、風速、視界など)を表示するサービスを提供します。

スクリーンショット 2026-01-21 12.44.22.png

スクリーンショット 2026-01-21 12.44.10.png

このアプリを、Java 8 → Java 25 にバージョンアップさせていきます。

Javaモダナイズ機能を使ってみる

Bob IDE を開くと、Workflows の中に Java modernization が追加されていることが確認できます。

スクリーンショット 2026-01-21 13.00.05.png

Workflow を開始すると、まず以下がチェックされます:

  • 現在のワークスペースが対象の Java プロジェクトか
  • SDKMAN がインストールされているか
    ※ 現時点では日本語未対応の部分が多いようです。

スクリーンショット 2026-01-21 13.02.38.png

分析(Analyze Project)を実行すると、プロジェクトスキャンの後、modernization type を選択できます。
今回は Java Upgrade → Target Java version: 25 を選択。

スクリーンショット 2026-01-21 13.05.32.png

さらに、試験的に Java EE → Jakarta EE 自動移行 の機能がありますが、今回はオフにします。
ランタイムとしてLiberty を利用している場合、Zero Migration により、古い Java EE API でも継続利用できます。

スクリーンショット 2026-01-21 13.07.33.png

OpenRewrite による自動修正 → AI エージェントによる追加修正へ

「Run Recipes」を押すと、OpenRewrite による自動修正が適用されます。
その後、Bob の AI エージェントがコードを読み取り、必要な修正タスク(ToDo リスト)を生成してくれます。

スクリーンショット 2026-01-21 13.12.37.png

スクリーンショット 2026-01-21 13.23.13.png

ここからは ToDo リストに従って修正していきます。

① sun.misc.Unsafe の削除

まずは、ModResortsEnv.java にて、sun.misc.Unsafe を全面削除し、内部API依存を解消していきます。
内部APIはJava 9 以降のモジュール境界で強く制限され、Java 25 でも利用が不安定/非推奨に近い扱いとなっています。

IBM Bob は以下の修正を自動で実施してくれました:

  • フィールド取得を Unsafe+オフセット方式から、通常のリフレクション(setAccessible(true)→f.get())へ変更
  • これに伴い、不要メソッド・不要インポートを削除してクラスを簡素化

修正後のコード:

ModResortsEnv.java
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など) を使ったセキュリティ設計へ移行できるよう改善されています。

修正後のコード:

Service.java
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

ビルドエラーがないことを確認し、タスク完了通知が表示されます。
スクリーンショット 2026-01-21 14.00.00.png

動作確認

最後に、アプリが正常に動作するか確認します。
mvn liberty:run
でLibertyサーバーを起動します。
http://localhost:9080/resorts/ にアクセスし、正常に動作していることを確認できました。

スクリーンショット 2026-01-21 14.19.30.png

スクリーンショット 2026-01-21 14.20.00.png

所感

Transformation AdvisorMigration Toolkitを用いた従来のモダナイズ方法と比較すると:

  • 修正点の検出、OpenRewrite による自動修正は従来ツールでも可能、ただしツールの事前準備やドキュメント理解がほぼ不要のため、導入〜利用までの手間は IBM Bob が圧倒的に少ない
  • エージェントによる追加修正は手動よりも圧倒的に工数が少ない(想定通りですが、やはり工数削減効果は大きく感じました)
  • ワークフローが視覚的に整理されていて、初心者でも手をつけやすい

一方で、現時点では一部 UI が英語のみのため、英語が苦手なユーザーにはやや壁があるかもしれません。
今回はシンプルなアプリでしたが、より複雑な Java EE アプリや大規模モジュールでも試してみたいと思います。

本投稿をご覧いただき、ありがとうございました。

5
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?