「うちのシステム、Javaで作られてるけど、もう古くて…」
「マイグレーション案件の話が来ているけど、手間も時間もかかるんだよな…」
そんなお悩み、ありませんか?
今回は、2025年5月に公開されたGitHub Copilotの拡張機能を使って、レガシーなJavaアプリケーションを生成AIにモダナイズさせてみました!
試してみた結果や、使ってみたメリット・注意点などをご紹介します。
目次
- 使ったツール
- 前提:環境準備
- 実際に使ってみた
①アプリケーションを診断してみた
②Javaバージョンアップグレードしてみた - 使ってみてわかったこと
- まとめ
1. 使ったツール
今回使ったのは、GitHub Copilotの2つの拡張機能です。
- GitHub Copilot app modernization for Java
JavaアプリケーションのAzure移行やモダナイズを支援するための診断ツールです。 - 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
- 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
最後に、インストールした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 |
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(); |
} |
} |
} |
} |
- VS Codeでプロジェクトを開く
- 左側に表示される「GitHub Copilot app modernization for Java」アイコンをクリック
- 「Run Assessment」ボタンを押す
- チャット画面内の「続行」ボタンを押す
GitHubへのログインを再度求められた場合は許可してください。
- 拡大
- 図4:GitHub Copilot app modernization for JavaをRunする画面
これにより、診断したプロジェクトが何をしているものなのか、バージョンアップが必要なレガシーな箇所がどこなのか、Azureでのサーバレスを行う場合どのツールを使うのが推奨されるかをレポートで教えてくれます。
- 拡大
- 図5:出力されたレポート
今回の場合、レポートに加えて以下の評価が出力されました。
実際に出力された評価レポート
アプリケーションの分析を実行して、Azure への移行とリプラットフォーミングの機会を評価します。 アプリケーションの評価が完了しました。分析レポートをご確認ください。
主な発見事項 レガシーコンポーネント:
|
この評価をもとに、どのような修正が必要かの方針検討に役立てることができます。
修正内容を決めたら、GitHub Copilotや後述のGitHub Copilot app modernization - upgrade for Javaを使い修正することができます。
② Javaバージョンアップグレードしてみた
次はGitHub Copilot app modernization - upgrade for Javaを使って、Java 21 + Spring Boot 3.2にアップグレードしてみます。
- VS Codeでプロジェクトを開く
- 左側に表示される「GitHub Copilot app modernization - upgrade for Java」アイコンをクリック
- 「Upgrade Java Project」ボタンを押す
上部中央に現在のコードの保存形式を選ぶ画面が表示されます。プロジェクトファイルをGit管理している場合は該当するものを選択、そうでない場合はEscキーを押して次に進んでください。
GitHubへのログインを再度求められた場合は許可してください。
- 拡大
- 図6:GitHub Copilot app modernization - upgrade for Javaを動かしたところの画面
これにより、アップグレードの処理が開始されます。
開始後は以下の操作を全部自動で行ってくれます。
- ビルドファイルの作成
- コードの修正
- フレームワークに沿ったプロジェクトファイルの自動生成
- テストコードの生成
- 単体テスト実行
エラーが発生した場合は原因の特定と修正、再テストも自動で行ってくれます。
- 拡大
- 図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:バージョンアップ前後のソースコードの比較(オレンジ色の部分が差分)
これを見ると、以下の箇所が修正されていることがわかります。
修正前 | 修正後 | |
---|---|---|
Javaのバージョン | Java8 | Java21 |
フレームワーク | なし | SpringBootFramework 3.2.12 |
ビルドファイル | なし | あり(Apache Maven) |
コレクション1 | Vector | ArrayList |
コレクション2 | Hashtable | HashMap |
コレクション3 | Date | LocalDateTime |
修正内容をよく見ると、DateがLocalDateTimeとなっており、登録日に日付だけでなく時間まで入るようになってしまいました。
このように、修正内容やテスト結果の確認した後、出力結果に差異が生じた場合は、チャット画面でGitHub Copilotに追加で修正指示を行い、再テストしてもらう必要があります。
- 拡大
- 図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を活用してモダナイズをやりたいけどどうすれば…」と思っていた方、ぜひ一度試してみてください!