「うちのシステム、Javaで作られてるけど、もう古くて…」
「マイグレーション案件の話が来ているけど、手間も時間もかかるんだよな…」

そんなお悩み、ありませんか?

 

今回は、2025年5月に公開されたGitHub Copilotの拡張機能を使って、レガシーなJavaアプリケーションを生成AIにモダナイズさせてみました!

試してみた結果や、使ってみたメリット・注意点などをご紹介します。

目次

  1. 使ったツール
  2. 前提:環境準備
  3. 実際に使ってみた
    ①アプリケーションを診断してみた
    ②Javaバージョンアップグレードしてみた
  4. 使ってみてわかったこと
  5. まとめ

1. 使ったツール

今回使ったのは、GitHub Copilotの2つの拡張機能です。

 

  1. GitHub Copilot app modernization for Java
    JavaアプリケーションのAzure移行やモダナイズを支援するための診断ツールです。
  2.  

  3. GitHub Copilot app modernization - upgrade for Java
     Javaのバージョンアップ(例:Java 8 → Java 21)、モダナイズを自動的に実施してくれるツールです。
    ※GitHubのEnterpriseプランに加入したアカウントが必要になります。

 

どちらもVS Codeにインストールして使います。

2. 前提:環境準備

まずは以下の4つを準備します。

  • GitHub Copilotのアカウント(今回はEnterpriseプランを使用)
  • VS Code
  • 古いJavaコード(今回はJava 8のサンプルアプリを使用)
  • Javaを動かすための各種ソフトウェア(JDK、AppCAT、Maven)

 

次に、VS Codeで以下の3つの拡張機能をインストールします。

  • GitHub Copilot
図1:GitHub Copilot
拡大
図1:GitHub Copilot
  • GitHub Copilot app modernization for Java
図2:GitHub Copilot app modernization for Java
拡大
図2:GitHub Copilot app modernization for Java
  • GitHub Copilot app modernization - upgrade for Java
図3:GitHub Copilot app modernization - upgrade for Java
拡大
図3:GitHub Copilot app modernization - upgrade for Java

最後に、インストールしたGitHub Copilotに、用意したGitHub Copilotのアカウントでログインします。
これで準備完了です。

3. 実際に使ってみた

① アプリケーションを診断してみた

まずはGitHub Copilot app modernization for Javaでアプリケーションの診断を実施します。
用意したJava 8のプロジェクトフォルダの構成は以下の通りです。

LegacyUserApp/

└── src/

└── UserApp.java

UserApp.javaのソースコードは以下の通りです。

UserApp.java

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.Date;

import java.util.Hashtable;

import java.util.Vector;

public class UserApp {

public static void main(String[] args) {

Vector users = new Vector();

Hashtable userCreated = new Hashtable();

BufferedReader reader = null;

try {

reader = new BufferedReader(new InputStreamReader(System.in));

System.out.println("ユーザー登録アプリケーション(終了するには 'exit' と入力)");

while (true) {

System.out.print("ユーザー名を入力してください: ");

String name = reader.readLine();

if ("exit".equalsIgnoreCase(name)) {

break;

}

if (!users.contains(name)) {

users.add(name);

userCreated.put(name, new Date());

System.out.println("ユーザー '" + name + "' を登録しました。");

} else {

System.out.println("ユーザー '" + name + "' はすでに存在します。");

}

}

System.out.println("\n登録されたユーザー一覧:");

for (String user : users) {

System.out.println(user + "(登録日: " + userCreated.get(user) + ")");

}

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (reader != null) reader.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

以下の手順で診断を進めていきます。
  1. VS Codeでプロジェクトを開く  
  2. 左側に表示される「GitHub Copilot app modernization for Java」アイコンをクリック
  3. 「Run Assessment」ボタンを押す
  4. チャット画面内の「続行」ボタンを押す
    GitHubへのログインを再度求められた場合は許可してください。
図4:GitHub Copilot app modernization for JavaをRunする画面
拡大
図4:GitHub Copilot app modernization for JavaをRunする画面

これにより、診断したプロジェクトが何をしているものなのか、バージョンアップが必要なレガシーな箇所がどこなのか、Azureでのサーバレスを行う場合どのツールを使うのが推奨されるかをレポートで教えてくれます。

図5:出力されたレポート
拡大
図5:出力されたレポート

今回の場合、レポートに加えて以下の評価が出力されました。

実際に出力された評価レポート

アプリケーションの分析を実行して、Azure への移行とリプラットフォーミングの機会を評価します。 アプリケーションの評価が完了しました。分析レポートをご確認ください。


この UserApp.java の評価では、以下のような要点が特定されたと思われます:

主な発見事項

レガシーコンポーネント:

  • Vector および Hashtable の使用 - これらは同期化されたコレクションで、現代的な Java 開発では ArrayList や HashMap が推奨されています
  • Java 8 以前のパターンの使用(try-with-resources が使用されていない)


Azure 移行の機会:

  • コンソールアプリケーションを Web アプリケーションに変換
  • Azure App Service での実行
  • Azure Database for PostgreSQL/MySQL でのデータ永続化
  • Azure Active Directory での認証機能追加


モダナイゼーションの推奨事項:

  1. コレクションクラスの更新: Vector → ArrayList, Hashtable → HashMap
  2. リソース管理の改善: try-with-resources パターンの適用
  3. Spring Boot フレームワーク: Web API やデータベース統合のため
  4. クラウドネイティブ機能: 設定管理、ログ記録、監視の追加


評価レポートの詳細を確認して、具体的な移行計画を立てることをお勧めします。何か特定の側面について詳しく知りたい場合は、お気軽にお尋ねください。

この評価をもとに、どのような修正が必要かの方針検討に役立てることができます。
修正内容を決めたら、GitHub Copilotや後述のGitHub Copilot app modernization - upgrade for Javaを使い修正することができます。

② Javaバージョンアップグレードしてみた

次はGitHub Copilot app modernization - upgrade for Javaを使って、Java 21 + Spring Boot 3.2にアップグレードしてみます。

 

  1. VS Codeでプロジェクトを開く
  2. 左側に表示される「GitHub Copilot app modernization - upgrade for Java」アイコンをクリック
  3. 「Upgrade Java Project」ボタンを押す
    上部中央に現在のコードの保存形式を選ぶ画面が表示されます。プロジェクトファイルをGit管理している場合は該当するものを選択、そうでない場合はEscキーを押して次に進んでください。
    GitHubへのログインを再度求められた場合は許可してください。
図6:GitHub Copilot app modernization - upgrade for Javaを動かしたところの画面
拡大
図6:GitHub Copilot app modernization - upgrade for Javaを動かしたところの画面

これにより、アップグレードの処理が開始されます。

開始後は以下の操作を全部自動で行ってくれます。

  • ビルドファイルの作成
  • コードの修正
  • フレームワークに沿ったプロジェクトファイルの自動生成
  • テストコードの生成
  • 単体テスト実行

エラーが発生した場合は原因の特定と修正、再テストも自動で行ってくれます。

図7:エラー自動修正の様子
拡大
図7:エラー自動修正の様子

最終的にプロジェクトフォルダの構成は以下の通りになりました。

LegacyUserApp/

├── src/

│   ├── main/java/com/example/userapp/UserApp.java

             # Spring Boot アプリケーション

│   ├── resources/application.properties

             # Spring Boot 設定

│   └── test/java/com/example/userapp/UserAppTests.java

             # JUnit テスト用のテストコード

├── pom.xml

             # Maven 設定 (Java 21 + Spring Boot 3.2.12)

└── target/  # ビルド結果

また、UserApp.javaのソースコードは以下のようになりました。

UserApp.java(左:修正前 右:修正後)

図8:バージョンアップ前後のソースコードの比較(オレンジ色の部分が差分)
拡大
図8:バージョンアップ前後のソースコードの比較(オレンジ色の部分が差分)

これを見ると、以下の箇所が修正されていることがわかります。

  修正前 修正後
Javaのバージョン Java8 Java21
フレームワーク なし SpringBootFramework 3.2.12
ビルドファイル なし あり(Apache Maven)
コレクション1 Vector ArrayList
コレクション2 Hashtable HashMap
コレクション3 Date LocalDateTime

修正内容をよく見ると、DateがLocalDateTimeとなっており、登録日に日付だけでなく時間まで入るようになってしまいました。
このように、修正内容やテスト結果の確認した後、出力結果に差異が生じた場合は、チャット画面でGitHub Copilotに追加で修正指示を行い、再テストしてもらう必要があります。

図9:追加の修正指示
拡大
図9:追加の修正指示

逆に言えば、ソースコードおよび単体テストのレビューを実施する以外の作業は、すべて生成AIに任せることが出来ます。

4. 使ってみてわかったこと

① 汎用GitHub Copilotとの違い

今回はツールの検証であるため、拡張機能を使わずにGitHub Copilotだけを使用した時との差分も検証しました。

 

  • 「モダナイズしたいのでどこを直せばいいのか教えて」
  • 「このアプリケーションをJava 21とSpring Boot 3.2.12にアップグレードして」

……などといった指示をGitHub Copilotに与えれば、アプリケーションの検証やバージョンアップの実施自体は可能です。

 

しかし、ツールを使用した場合と比べると

  • レポートという形での出力はしてくれない。
  • 途中で「続行」ボタンを押さないと進まない場面が明らかに多い上に、修正のワークフローが冗長。拡張機能を使用した際の全自動アップグレードに比べるとかなり物足りない。
  • 全体的にバージョンアップ完了まで時間がかかる。

……などのデメリットがありました。

 

使い分けの指針は大まかに以下の様になりそうです。

汎用Copilot が適している場合

  • 学習目的(過程を理解したい)
  • 小〜中規模プロジェクト
  • カスタム要件が多い
  • エラー発生時の詳細分析が必要

専用ツールが適している場合

  • 大規模プロジェクト
  • 標準的なアップグレード
  • 時間効率重視
  • 既存のマイグレーションパターンに従う

 

パターン化されて安定した品質、効率、変換速度を求める場合はGitHub Copilot app modernization for Javaを使うのがよさそうです。

② GitHub Copilot app modernization for Javaが苦手なこと

新しいバージョンのJava、新しいバージョンのフレームワークを使用したプロジェクトへのモダナイズはかなりの速度と精度でやってくれるのですが、登録日として扱われる文字列が「yyyy-MM-dd(Data)」から「yyyy-MM-dd HH:mm:ss(LocalDateTime)」に変わってしまうということがありました。


マイグレーションを実施する際は、バージョンアップ後も修正前と同じ動作をすることが基本的には期待されていると思います。また、「処理の速度が大幅に下がった」「前よりも処理が複雑になり保守が大変そう」などの事態も防ぐ必要があります。


この先も生成AIの進化は進むと思いますが、以下については人間によるサポートがまだ必要な箇所かなと実感しました。

  • システムの要件や設計の意図、改修の背景や制約事項を理解して、生成AIによる修正の監修&レビューをする
  • 修正内容のどこに問題があるかを端的にプロンプトに書き表して、生成AIに修正を依頼する

5. まとめ

GitHub Copilotの拡張機能を使えば、レガシーなJavaアプリケーションのモダナイズがかなり簡単にできます。

  • モダナイズのための診断、修正、ビルド、テスト実行、不具合修正まで包括的に対応してくれる
  • ほとんど自動で実施してくれるので、手動での作業を大幅に削減
  • 既存のマイグレーションパターンに従ってくれるので、ほぼベストプラクティスでのモダナイズができる

 

今までもプログラミング言語やフレームワークのバージョンアップ案件はいろいろと経験してきたのですが、この拡張機能があればかなりの部分をGitHub Copilotにお任せして省力化できそうです。


今後は、実際のプロジェクトでもこのツールを活用していく予定です。「生成AIを活用してモダナイズをやりたいけどどうすれば…」と思っていた方、ぜひ一度試してみてください!