はじめに
今回は、Claude Codeを活用して自分たちが管理しているバッチアプリケーションをJava 25にアップデートした経験を共有します。
なぜJava 25なのか?
Java 25は最新のLTS(Long Term Support)版であり、以下のような利点があります:
- 最新のセキュリティパッチ
- パフォーマンスの改善
- 最新の言語機能とAPI
- より長いサポート期間
ただし、最新版ゆえの課題も存在します。本記事では、その課題とどう向き合ったかを紹介します。
対象システム
- アプリケーション: Spring Boot 3.5系のバッチアプリケーション
- 現在のJavaバージョン: Java 21
- ビルドツール: Gradle 8.x
- モニタリング: Datadog APM
- インフラ: Docker + AWS ECS
Claude Codeとは
Claude Codeは、Anthropic社が提供するAI支援開発ツールです。コードの調査、実装、デバッグなどを対話的に支援してくれます。
今回は以下の用途で活用しました:
- 依存関係の互換性調査
- Dockerfileの更新
- エラーログの解析
- GitHub Actions設定の確認
アップデート手順
1. 調査フェーズ
まず、Claude Codeに現状を伝えて調査を依頼しました。
私: Java 25にアップデートしたい。何を確認すべき?
Claude Code: 以下を確認しましょう:
1. 依存ライブラリのJava 25対応状況
2. Gradleプラグインの互換性
3. Dockerベースイメージの対応状況
4. 既知の破壊的変更
Claude Codeは既存のbuild.gradleを読み込み、各依存関係について調査してくれました。
2. ビルド設定の更新
build.gradleの更新も自動的に提案されました:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(25)
}
}
3. Dockerfileの更新
# 変更前
FROM eclipse-temurin:21-jdk-jammy AS builder
# 変更後
FROM eclipse-temurin:25-jdk-jammy AS builder
さらに、jlinkによるカスタムランタイム生成も更新:
FROM eclipse-temurin:25-jdk-jammy AS jre-build
RUN "$JAVA_HOME"/bin/jlink \
--add-modules java.base,java.compiler,... \
--strip-debug \
--no-man-pages \
--no-header-files \
--compress=2 \
--output /javaruntime
遭遇した課題
課題1: 実行後に発覚したDatadogのクラッシュ
ビルドは問題なく通り、バッチ実行も正常終了(ExitCode=0)していました。一見すべて正常に見えたのですが、チームメンバーから「Datadog Agentのエラーが出ています」と指摘がありました。
詳細なログを確認すると、Datadog Agent 1.39.0が完全にクラッシュしていました:
[dd.trace 2025-12-10 02:00:16:272 +0000] [main] ERROR datadog.trace.bootstrap.Agent -
Throwable thrown while installing the Datadog Agent
...
Caused by: java.lang.IllegalStateException: Failed to resolve the class file version
of the current VM: Unknown Java version: 0
何が起きていたか:
- ビルド:成功
- アプリケーション実行:成功(ExitCode=0)
- Datadog Agent:完全にクラッシュ(Java 25を認識できない)
つまり、dev環境では監視できない状態でバッチが動いていたことになります。幸い、stg環境でチームメンバーが問題を発見してくれたため、本番環境(prd)に到達する前に対応できました。
段階的リリースプロセス(dev → stg → prd)の重要性を改めて実感した瞬間でした。
さらに、以下のJava 25特有の警告も大量に出力されていました:
WARNING: A restricted method in java.lang.System has been called
WARNING: java.lang.System::load has been called by com.datadoghq.profiler.LibraryLoader
WARNING: Restricted methods will be blocked in a future release unless native access is enabled
WARNING: A terminally deprecated method in sun.misc.Unsafe has been called
WARNING: sun.misc.Unsafe::objectFieldOffset has been called by datadog.jctools.util.UnsafeAccess
WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release
なぜ気づかなかったのか:
- ビルドが成功していた(コンパイルエラーなし)
- アプリケーションの実行が成功していた(ExitCode=0)
- ビジネスロジックは正常に動作していた
- Datadog Agentのエラーは、詳細なログを見ないと分からなかった
原因:
- Datadog Java Agent 1.39.0はJava 25に未対応
- Java 25では、セキュリティと安定性向上のため、以下の機能が制限:
- Security Manager(Java 17で非推奨化)
-
sun.misc.Unsafeの一部API(内部API、非推奨化)
対応:
この問題に気づいてから、Claude Codeと一緒に調査を開始しました:
- Datadog Java AgentのJava 25対応状況を調査
- 公式ドキュメントから、Java 25対応版(1.56.2)を発見
- Dockerfileを更新してバージョンアップ
# 変更前
ARG DD_JAVA_AGENT_VERSION=1.39.0
# 変更後
ARG DD_JAVA_AGENT_VERSION=1.56.2
結果:
Datadog Java Agent 1.56.2にアップデートすることで:
- ✅ Agent初期化エラーが解消(Java 25を認識できるようになった)
- ✅ 監視機能が復活(トレース・プロファイリングが正常動作)
- ⚠️ 警告は依然として出力される
ただし、1.56.2でも警告が出続ける理由:
- Java 25の非推奨機能(Unsafe API等)を使用している
- 警告は出るが、実行には影響なし(ExitCode=0で正常終了)
- 将来のDatadog更新で解消される可能性が高い
判断:
- 1.39.0:Agent完全クラッシュ → 即座に対応必須
- 1.56.2:警告のみ、監視機能は正常 → 当面許容可能
課題2: プロジェクト固有のルールへの対応
CI/CDパイプラインには、バージョン管理に関する独自のルールがありました。Claude Codeはプロジェクト固有の運用ルールを知らないため、最初の提案がそのルールに抵触してしまいました。
対応:
プロジェクトの運用ルールを補足説明し、それに合わせた対応を行いました。
この経験から学んだこと:
- CI/CDパイプラインの仕組みを理解することの重要性
- AIツールも、プロジェクト固有の制約は教えてあげる必要がある
Claude Codeの活用ポイント
✅ 得意なこと
-
公式ドキュメントの調査
- Datadogのリリースノートから互換性情報を抽出
- JavaのJEP(Java Enhancement Proposal)の確認
-
コード変更の提案
- 依存関係の更新
- Dockerfile、build.gradleの修正案
- 一貫性のある変更
-
エラーログの解析
- Java 25の警告メッセージを解釈
- 原因と影響の説明
- 対応方針の提案
⚠️ 限界と注意点
-
プロジェクト固有のルールは知らない
- CI/CDパイプラインの仕組み
- バージョン管理の運用ルール
- → 人間が補足説明する必要あり
-
最新情報は2024年初頭まで
- Java 25のリリースノート(2024年9月)は知らない可能性
- → 最新の公式ドキュメントを参照させる
-
判断は最終的に人間が行う
- 警告を許容するか、対応を待つか
- リリースタイミング
- リスク評価
効果的な対話のコツ
1. 段階的に質問する
❌ 悪い例:
「Java 25にアップデートして」
✅ 良い例:
1. 「Java 25にアップデートしたい。まず依存関係を確認して」
2. 「Datadog Agentは1.56.2が良さそう。他に変更必要な箇所は?」
3. 「この警告は問題ない?原因を教えて」
2. コンテキストを共有する
「本番環境でこういう警告が出た。これは問題?」
(ログを貼り付け)
Claude Codeは提供された情報を元に分析してくれます。
3. 確認と検証は人間が行う
Claude Codeの提案を鵜呑みにせず:
- ローカルでビルドテスト
- 開発環境でのバッチ実行確認
- レビュワーの意見を聞く
実施結果
✅ 成功したこと
- Java 25へのアップデート完了
- 本番環境での動作確認(警告はあるが正常動作)
- Claude Codeによる作業時間の大幅短縮
まとめ
学んだこと
-
AI支援ツールは強力だが、万能ではない
- 公式ドキュメントの調査や定型作業は得意
- プロジェクト固有の知識は人間が補完する
-
段階的アプローチが重要
- いきなり本番投入せず、dev → stg → prd
- 各段階で動作確認と警告の調査
-
ビルドが通っても、実行が成功しても安心できない
- ビルド成功 ≠ 完全に問題なし
- 実行成功(ExitCode=0) ≠ すべてのコンポーネントが正常
- 特に監視ツールは要注意:クラッシュしていても気づきにくい
- チームメンバーの目が問題発見に役立つ
- 詳細なログの確認は必須(標準出力だけでは不十分)
今後の展望
- Datadog Agent更新の追跡
- 他のアプリケーションへの展開
参考資料
- OpenJDK Java 25 Release Notes
- Datadog Java Agent Releases
- Spring Boot 3.5 Documentation
- Claude Code Documentation
おわりに
Java 25は最新のLTSであり、早期に採用することでセキュリティやパフォーマンスの恩恵を受けられます。一方で、エコシステムの対応状況を確認しながら進める必要があります。
Claude CodeのようなAI支援ツールを活用することで、調査や実装の時間を大幅に短縮できました。ただし、最終的な判断は人間が行う必要があり、AI+人間の協働が効果的だと実感しました。
この記事が、Java 25へのアップデートやAI支援ツールの活用を検討している方の参考になれば幸いです。