5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude CodeでJava 25へのアップデートを実践してみた

5
Posted at

はじめに

今回は、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

なぜ気づかなかったのか:

  1. ビルドが成功していた(コンパイルエラーなし)
  2. アプリケーションの実行が成功していた(ExitCode=0)
  3. ビジネスロジックは正常に動作していた
  4. Datadog Agentのエラーは、詳細なログを見ないと分からなかった

原因:

  • Datadog Java Agent 1.39.0はJava 25に未対応
  • Java 25では、セキュリティと安定性向上のため、以下の機能が制限:
    • Security Manager(Java 17で非推奨化)
    • sun.misc.Unsafeの一部API(内部API、非推奨化)

対応:

この問題に気づいてから、Claude Codeと一緒に調査を開始しました:

  1. Datadog Java AgentのJava 25対応状況を調査
  2. 公式ドキュメントから、Java 25対応版(1.56.2)を発見
  3. 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でも警告が出続ける理由:

  1. Java 25の非推奨機能(Unsafe API等)を使用している
  2. 警告は出るが、実行には影響なし(ExitCode=0で正常終了)
  3. 将来のDatadog更新で解消される可能性が高い

判断:

  • 1.39.0:Agent完全クラッシュ → 即座に対応必須
  • 1.56.2:警告のみ、監視機能は正常 → 当面許容可能

課題2: プロジェクト固有のルールへの対応

CI/CDパイプラインには、バージョン管理に関する独自のルールがありました。Claude Codeはプロジェクト固有の運用ルールを知らないため、最初の提案がそのルールに抵触してしまいました。

対応:
プロジェクトの運用ルールを補足説明し、それに合わせた対応を行いました。

この経験から学んだこと:

  • CI/CDパイプラインの仕組みを理解することの重要性
  • AIツールも、プロジェクト固有の制約は教えてあげる必要がある

Claude Codeの活用ポイント

✅ 得意なこと

  1. 公式ドキュメントの調査

    • Datadogのリリースノートから互換性情報を抽出
    • JavaのJEP(Java Enhancement Proposal)の確認
  2. コード変更の提案

    • 依存関係の更新
    • Dockerfile、build.gradleの修正案
    • 一貫性のある変更
  3. エラーログの解析

    • Java 25の警告メッセージを解釈
    • 原因と影響の説明
    • 対応方針の提案

⚠️ 限界と注意点

  1. プロジェクト固有のルールは知らない

    • CI/CDパイプラインの仕組み
    • バージョン管理の運用ルール
    • → 人間が補足説明する必要あり
  2. 最新情報は2024年初頭まで

    • Java 25のリリースノート(2024年9月)は知らない可能性
    • → 最新の公式ドキュメントを参照させる
  3. 判断は最終的に人間が行う

    • 警告を許容するか、対応を待つか
    • リリースタイミング
    • リスク評価

効果的な対話のコツ

1. 段階的に質問する

❌ 悪い例:

「Java 25にアップデートして」

✅ 良い例:

1. 「Java 25にアップデートしたい。まず依存関係を確認して」
2. 「Datadog Agentは1.56.2が良さそう。他に変更必要な箇所は?」
3. 「この警告は問題ない?原因を教えて」

2. コンテキストを共有する

「本番環境でこういう警告が出た。これは問題?」
(ログを貼り付け)

Claude Codeは提供された情報を元に分析してくれます。

3. 確認と検証は人間が行う

Claude Codeの提案を鵜呑みにせず:

  • ローカルでビルドテスト
  • 開発環境でのバッチ実行確認
  • レビュワーの意見を聞く

実施結果

✅ 成功したこと

  • Java 25へのアップデート完了
  • 本番環境での動作確認(警告はあるが正常動作)
  • Claude Codeによる作業時間の大幅短縮

まとめ

学んだこと

  1. AI支援ツールは強力だが、万能ではない

    • 公式ドキュメントの調査や定型作業は得意
    • プロジェクト固有の知識は人間が補完する
  2. 段階的アプローチが重要

    • いきなり本番投入せず、dev → stg → prd
    • 各段階で動作確認と警告の調査
  3. ビルドが通っても、実行が成功しても安心できない

    • ビルド成功 ≠ 完全に問題なし
    • 実行成功(ExitCode=0) ≠ すべてのコンポーネントが正常
    • 特に監視ツールは要注意:クラッシュしていても気づきにくい
    • チームメンバーの目が問題発見に役立つ
    • 詳細なログの確認は必須(標準出力だけでは不十分)

今後の展望

  • Datadog Agent更新の追跡
  • 他のアプリケーションへの展開

参考資料

おわりに

Java 25は最新のLTSであり、早期に採用することでセキュリティやパフォーマンスの恩恵を受けられます。一方で、エコシステムの対応状況を確認しながら進める必要があります。

Claude CodeのようなAI支援ツールを活用することで、調査や実装の時間を大幅に短縮できました。ただし、最終的な判断は人間が行う必要があり、AI+人間の協働が効果的だと実感しました。

この記事が、Java 25へのアップデートやAI支援ツールの活用を検討している方の参考になれば幸いです。

5
0
0

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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?