Javaモダナイゼーション:エンタープライズアップグレードを現実的に
大企業に足を踏み入れると——銀行、航空会社、通信会社——大抵Javaが重要な処理を担っています。コアバンキングシステム、不正検知パイプライン、注文管理、日の出前に数百万件のトランザクションを照合する夜間バッチジョブ。動いていて、スケールする。だからこそ、その多くがJava 8、あるいはそれ以前のバージョンで今も稼働しているのです。
動いていることと健全であることは違います。フレームワークはセキュリティパッチが届かなくなったバージョンに留まり続けています。最初の開発者はとっくにいない。「触るな、動いているんだから」が建築原則と化してしまいました。そして差は広がり続けています。records、sealed classes、pattern matching、virtual threads、G1/ZGCコレクター、コンテナ対応の向上、高速起動——これらはすべて、誰もスケジュールしたがらないアップグレードの向こう側に待っています。
この記事はその差を埋める話です。なぜアプリケーションが止まってしまうのかを説明し、Premium Package for Javaの5つの機能——JDKバージョンアップグレード、Libertyリプラットフォーミング、UIモダナイゼーション、ユニットテスト生成、セキュリティ修復——それぞれがどのように確定的な自動化とAIの間で作業を分担するかを解説します。最後に、最大限に活用するためにリポジトリに必要なもの、アクセスの取得方法、始め方を説明します。
なぜ多くのJavaアプリが10年遅れに止まっているのか
モダナイゼーションがこれほど明らかに価値があるなら、なぜ多くのエンタープライズJavaアプリケーションが2014年頃で止まって見えるのでしょうか?原因は構造的です——組織的な慣性と本物のエンジニアリングリスク。
- 設計ではなく有機的な成長。 これらのシステムは機能ごと、買収ごとに成長しました。古いコード層の上に新しいコード層が積み重なり、それぞれが異なる締め切りと慣習のもとで書かれています。今あなたが受け継ぐものは地質学的な堆積物に似ています——10年間にわたる何十ものチームによる意思決定の結果です。
- コアモジュールを書いたエンジニアたちは去り、暗黙の知識も一緒に消えました。残るのは乏しいドキュメントと、「あのモジュールの動き方はなんとなく覚えている」ベテランエンジニア数人だけです。
- Javaのアップグレードは依存関係の監査、フレームワークのアップグレード(Spring、Hibernate、Jakarta EEネームスペース移行)、非推奨APIの削除、あらゆる環境での再検証を意味します——数ヶ月の作業、本物の予算、本物の機会コスト。システムがすでに動いているなら正当化が難しい。
- Java 8 → 17または21のジャンプだけでも、モジュールシステムの競合、削除された内部API(
sun.misc.Unsafe)、ハードエラーに変わるreflection警告、ガベージコレクターの微妙な動作変更が浮かび上がることがあります。紙の上のバージョンバンプが実際には数週間の調査になります。 - リグレッションサイクルが長い。 広大なテストスイート——ユニット、統合、パフォーマンス、UAT、時に手動承認——は、単一のアップグレードがリリース前に数週間のテストを引き起こす可能性があることを意味します。
- その下にあるのは、動いているものを壊すことへの恐怖です。アプリケーションが1日に何百万ドルもの処理をしているなら、悪いデプロイのコストはアップグレードしないコストをはるかに上回ります——そのため、アップグレードの話は次の四半期へ、そしてその次へとずれ込みます。
出口は漸進的なアプローチであり、書き直しではありません。適切なツールがあれば、それぞれが安全にリリースできるほど小さなステップで技術的負債を返済していくことができます。
Premium Package for Java
Premium Package for Javaは、エンタープライズJavaモダナイゼーションのための5つのワークフローのスイートです。それぞれは同じ分業の原則で構築されています——確定的な自動化に予測可能な機械的作業をさせ、AIにレシピでは表現できない文脈的な判断を処理させる。
OpenRewriteのようなルールベースエンジンは、数千のファイルにわたる機械的なリファクタリングで信頼性があります。AIは厄介な部分——ビルドエラーの解釈、ビジネスロジックの推論、トレードオフ間の選択——が得意です。Bobは両者をステップワイズなワークフローで調整し、重要なステップは人間が承認します。
その背後にある専門知識は重要です。ワークフローはIBMとRed HatのエンジニアによってJITコンパイラを構築し、WebSphereとOpen Libertyをリリースし、Quarkusの開拓を支援し、OpenJDK、Jakarta EE、MicroProfileに貢献した形で作られています。ツールはそれらのチームがどのように移行に取り組むかをエンコードしています——モデルが目の前のコードから再構築できない知識です。
5つの機能全体での分担はこのようになっています。
機能1:JDKバージョンアップグレード——Java 8から11、17、21、または25へ
JDKのアップグレードは最も一般的なモダナイゼーションタスクであり、最も過小評価されているものです。Bobはこれを単一のコマンドではなく、複数段階の証拠主導の旅として扱います。
- まずプロジェクトインテリジェンス。 Bobはビルドツール(MavenまたはGradle)、モジュールトポロジー、現在のJavaバージョン、フレームワークのフットプリントを分析し、実行可能なアップグレードパス(8→17、8→21、Jakarta EEあり/なし)を提案します。それぞれに難易度評価と想定される技術的課題が注釈付きで示されます。
- 選択したターゲットに対して、厳選されたOpenRewriteレシピが機械的な変換を安全に大規模に処理します。
- レシピで進める部分は実際のところ40〜50%です。残り——奇妙な依存関係の競合、削除された内部API、ライブラリ固有の破損——はエージェントループの出番です。Bobはプロジェクトをコンパイルし、Maven/Gradleのビルドログを解析し、根本原因ごとに例外をグループ化し、モジュールごとに的を絞った修正をAIに求めます。
- 意図を尊重するガードレール。 AIは
javaxとjakartaのネームスペース間を黙って切り替えないこと、「コンパイルを通すために」コードをコメントアウトしたりファイルを移動したりしないこと、パッケージや依存関係の変更前に明示的な承認を求めることを指示されています。
自動化できるところは速く、できないところは慎重に——最後に完全な監査証跡が残るアップグレードが得られます。
機能2:Libertyリプラットフォーミング——従来のWebSphereからLibertyへ
従来のWebSphere Application ServerからWebSphere LibertyまたはOpen Libertyへの移行は、メモリフットプリントの削減、コンテナフレンドリーなパッケージング、高速起動、モダンなJakarta EEサポートをもたらします。また、手動で試みる最も複雑な移行の一つでもあります。
- AMA主導のアセスメント。 BobはIBMのApplication Modernization Acceleratorの出力を取り込み、レポートをファイルレベルの具体的な移行問題にパースして、ルールベースの修復ガイダンスを提供します。
- 各AMAルールには規範的なガイダンスが含まれています——「
com.ibm.websphere.*をJakarta EE標準の同等物に置き換える」「ibm-web-ext.xmlの設定をserver.xmlに移行する」。Bobはこれらの問題を根本原因ごとにグループ化し、ルールのヘルプテキストとともにAIに渡すため、モデルは推測ではなく既知の修正を適用します。 - 移行にJakartaジャンプが含まれる場合、同じOpenRewriteレシピライブラリがネームスペースの仕組みを確定的に処理します。
- ビルド、デプロイ、検証。 Bobはthe WAR/EARをビルドし、
liberty-maven-pluginまたはliberty-gradle-pluginを使ってデプロイし、起動とクラスロードの失敗についてサーバーログを追跡し、反復的に解決します。RESTエンドポイントに対するcurlによる機能検証は標準フローの一部です。
ワークフローは汎用的なプロンプトに任せるのではなく、Libertyエンジニアが移行にどう取り組むかをエンコードしています。
機能3:UIモダナイゼーション——JSP/Struts からモダンなSPAへ
ほとんどのレガシーJavaアプリは、JSP、Struts、またはサーブレットを通じてUIを動かしています。Bobはこれを5段階のパイプラインに分割します。
- アーキテクチャの抽出。 コードが書き直される前に、Bobはアプリケーションを分析し、すべてのコントローラー、アクション、サーブレット、ページ、フォーム、バリデーションルール、データフローパスをカタログ化した
architecture.mdを作成します。そのドキュメントが移行の残り全体の信頼できる情報源になります。 - レガシープレゼンテーション層(Struts actions、サーブレット、JSPコントローラー)は、モダンなバックエンド——Spring Boot、Quarkus、またはLiberty——のRESTエンドポイントに変換され、データベースの整合性を保護するために元のDAOとモデルクラスはそのままにされます。
- フロントエンドスキャフォールディング。 新しいTypeScriptプロジェクト(Angular、React、または別のフレームワーク)が選択されたデザインシステム——Carbon、Material UI、またはshadcn/ui——に接続され、HTTPクライアント、テーミング、ルーティング、状態管理、エラーバウンダリ、CORSがフィーチャー作業の開始前に設定されます。
- JSPフォームとテーブルはデザインシステムの同等物——DataTable、Card、DatePicker、バリデーション済みフォーム——にマッピングされ、元のビジネスルールが引き継がれます。
- 各ステップの検証ゲート。 Bobはアプリケーション自体を起動しません。各フェーズの後、開発者にビルド/起動コマンドを実行して確認するよう求め、検証を人間の手に委ねます。
AIはJSPタグスープからモダンコンポーネントへの文脈的な翻訳を担当し、自動化はスキャフォールディング、依存関係、ビルド検証を処理します。
機能4:ユニットテスト——まず戦略、そして生成
テストカバレッジはしばしばモダナイゼーションの最大の障壁です——安全に検証できないものは安全にアップグレードできません。Bobはテストを生成する前にテスト戦略を生成します。
- 戦略生成。 Bobはプロジェクトを分析し、アーキテクチャ、カバレッジが必要なモジュール、推奨フレームワーク(JUnit 5、Mockito、AssertJ)、命名規則、カバレッジ閾値、カバレッジレポートあり/なしでテストを実行するための正確なコマンドをカバーする
UNITTEST.mdを作成します。 - 候補の選択は複数の粒度で機能します——パッケージ全体、特定のクラス、個別のメソッド——git diffで最近変更されたコードに作業を集中させることもできます。
- 生成、実行、修正。 すべてのテストプロンプトは同じ指示で終わります:テストを実行し、失敗を修正する。AIは実行し、失敗を観察し、コード生成で止まるのではなくスイートが緑になるまで反復します。
- BobはJaCoCoと統合するため、ループは単独で緑のテスト実行ではなく測定されたカバレッジを目標とします。
自動化がテストを実行し、AIがテストを書いて失敗について推論します。結果として得られるカバレッジが他の4つのワークフローのブロックを解除するものです。
機能5:セキュリティ修復——同じループの一部としてのCVE
CVEだらけの依存関係を持ち続けるモダナイズされたアプリは、半分しか完成していません。セキュリティ修復は、脆弱性に向けたJDKアップグレードと同じアーキテクチャを再利用します。
- ビルド主導の検出。 Bobはアップグレードワークフローのなかから MavenとGradleのログアナライザーを再利用し、ビルド出力、dependency-checkプラグイン、SBOMツールからの依存関係アドバイザリ、非推奨警告、既知の脆弱なトランジティブ依存関係を浮かび上がらせます。
- 修正がクリーンなバージョンバンプではない場合——パッチが当たったライブラリがシグネチャを変更し、コールサイトの移行が必要な場合——エージェントループは根本原因ごとに破損をグループ化し、モジュール全体に修復を適用し、検証のために再ビルドします。
- 同じガードレールが適用されます。 明示的な承認なしに依存関係を変更しない、コードをコメントアウトしない、ネームスペースサプライズなし。修正は適用される前に提示され、説明され、確認されます。
セキュリティ強化は別のロードマップとしてではなく、残りのモダナイゼーション作業と同じトラックで実行されます。
共通の糸
5つの機能すべてにわたって、同じ分業が成立します:
| フェーズ | 担当 |
|---|---|
| プロジェクト分析とメタデータ抽出 | 自動化 |
| 機械的で既知の変換 | OpenRewriteレシピ |
| ビルド、ログ解析、エラーグループ化 | 自動化 |
| 文脈的判断、エラー修復、コード変換 | AI |
| 承認ゲート、検証、デプロイ | Human-in-the-loop |
| 監査証跡(Mermaidダイアグラム、タスクサマリー、コスト追跡) | 自動化 |
自動化は確定的なものを処理し、AIは文脈的なものを処理し、人間は重要なものを承認します——プラットフォームの下に構築したIBMとRed Hatのエンジニアに支えられて。
リポジトリを準備する
これらのワークフローは、すでに読みやすいコードベースでより遠くに到達します——Bobを助けるものは、コードを受け継ぐすべてのエンジニアを助けるものと同じです:
- 緑色で合理的に高速なビルド。 ここのすべてのループはコンパイルとテストの出力に固定されています。
mvn/gradleビルドが速くて信頼できるほど、生成-実行-修正のサイクルは締まります。 - 既存のテスト(部分的なものでも)。 カバレッジはアップグレードの安全網でもあり、Bobが読むシグナルでもあります。少ない場合は、バージョンジャンプを試みる前に機能4から始めてください。
- 固定された宣言済みの依存関係ツリー。 明確な
pom.xml/build.gradleのバージョンと最新の依存関係ロックは、クリーンなレシピ実行と数日がかりの競合解消の違いを生み出します。 - Bobが動かせるビルドツール。 LibertyとセキュリティワークフローはSは標準プラグイン(
liberty-maven-plugin、dependency-check、SBOMツール)に依存しています。それらを準備しておくことで自動化の半分が仕事をできるようになります。
アクセスの取得方法
Premium Package for Javaは個別のダウンロードではなく、BobのベースプランへのAdd-onです。
権限の取得方法はプランによって異なります:
- 個人プラン(Pro、Pro+、Ultra)。 bob.ibm.comの料金ページに移動し、プランを選んでチェックアウト時にJava add-onを追加します。注文を完了してBob IDEをインストールすると、ログイン時に権限が検出されます。bob.ibm.comのサブスクリプションからシートとadd-onを管理します。
- エンタープライズプラン。 BobのアドミニストレーターがBob Admin UIからベースプランのシートとJava add-onを割り当てます。シートが割り当てられると、同じ自動検出が適用されます——ログインするとワークフローが表示されます。
明示しておく価値のある2つのこと:
- チェックアウト時にJava add-onを選択する必要があります。 デフォルトではベースプランの一部ではありません。購入時にスキップすると、有料プランでもワークフローは表示されません。
- トライアルプランはadd-onを使用できません。 Premium Package for Javaには有料のPro、Pro+、Ultra、またはエンタープライズプランが必要です。
始めましょう
プランにadd-onが含まれ、Bob IDEにサインインしたら:
- まず単一のモジュールでJDKアップグレード評価を実行して、ターゲットにコミットする前に提案されたパスと難易度評価を確認してください。
- カバレッジが薄い場合は、バージョンジャンプの前に
UNITTEST.md戦略を生成して安全網を構築してください。 - モジュールごとに変更を承認してください——ガードレールはネームスペースと依存関係の変更をあなたの手に保つためにあります。
チームがこれらの移行をエンドツーエンドでどのように実行したかについては、bob.ibm.comのケーススタディをご覧ください。
