【時間がない人向け】記事の3行要約
- JDK 23ではアノテーション処理のデフォルトポリシーが変更され明示的な有効化が必要に
- アノテーション処理を使用する場合は-proc:fullオプションを指定する必要がある
- -proc:fullは17u、11u、8uにもバックポートされ移行が容易化された
Java 17と11でもアノテーション処理ポリシーの変更に対応
JDK 23ではjavacのアノテーション処理に関するデフォルトの動作が変更され、明示的にオプションを指定しない限りアノテーション処理が実行されなくなる。この変更はアノテーションプロセッサがクラスパスに意図せず含まれてしまった場合のビルド出力の堅牢性を高めるためのものだ。[1]
アノテーション処理を使用するコードベースでは、少なくとも-processor、--processor-path、--processor-module-pathのいずれかのオプションを指定するか、-proc:onlyまたは-proc:fullを明示的に指定する必要がある。これらのオプションを指定しない場合、JDK 23ではデフォルトで-proc:noneが適用される。
移行を容易にするため、-proc:fullオプションは2024年4月のセキュリティアップデートでJDK 17u(17.0.11)、11u(11.0.23)、およびOracle JDK 8u(8u411)にもバックポートされている。これにより、javacのデフォルトポリシー変更の前後で同じビルド設定を使用することが可能になる。
JDK 23でアノテーション処理のデフォルトがオフに
JDK 6で導入されたjavacのアノテーション処理機能は、ソースファイルからアノテーションをスキャンしてアノテーションプロセッサを実行することで、コンパイル時のコード生成を可能にする。JDK 22までは、この機能がデフォルトで有効になっていた。
しかし、アノテーションプロセッサがクラスパスに意図せず含まれてしまった場合のビルド出力の安定性を高める観点から、JDK 23ではアノテーション処理をデフォルトで無効化し、明示的なオプション指定を必須とする仕様変更が行われた。-proc:noneがデフォルトポリシーとなり、アノテーション処理を行うには-proc:onlyか-proc:fullの指定が必要だ。
JDK 21では、デフォルトポリシーの下で暗黙的なアノテーション処理の使用が検出された場合に情報メッセージが出力されるようになっており、将来の変更に備えた移行措置が取られていた。-proc:fullが17uと11u、8uにバックポートされたことで、ポリシー変更の前後でビルド設定を統一できるようになった。
trends編集部「K」の一言
JDKのアノテーション処理ポリシー変更は、ビルドの堅牢性を高めるための仕様変更であり、基本的には歓迎すべき方向性だと言えるだろう。アノテーションプロセッサは、ビルド時のコード生成を可能にする強力なツールである一方で、意図せずクラスパスに含まれてしまった場合に予期しない動作を引き起こす可能性がある。デフォルトを無効化することで、そうしたリスクを軽減できる。
ただし、これまでアノテーション処理に依存していたビルドでは、明示的なオプション指定が必須になるため、一定の移行作業が必要だ。特に、古いバージョンのビルドツールやプラグインを使っているプロジェクトでは、-proc:fullへの対応状況を確認する必要がある。JDKのリリースノートやツールのドキュメントを参照し、適切に設定を更新していくことが求められる。
フレームワークやライブラリの開発者は、アノテーション処理を使用する際のベストプラクティスをユーザーに提示することが重要だろう。ビルドスクリプトのサンプルを提供したり、-proc:fullへの移行手順を解説したりすることで、ユーザーがスムーズに新しいポリシーに対応できるようサポートすべきだ。コード生成を利用する場面では、ビルドの再現性や移植性に十分配慮し、適切なオプションを設定するよう呼びかけることが望ましい。
今回のJDKの変更は、ツールベンダーやライブラリ開発者、アプリケーション開発者が協調して対応していくことで、Javaエコシステム全体のセキュリティと安定性の向上につながることが期待できる。単にオプションを追加するだけでなく、アノテーション処理の適切な使い方について改めて見直し、健全なビルドプラクティスを追求していくことが肝要だろう。一時的な移行コストはあるものの、長期的にはJavaプラットフォームの発展に寄与するものと考えられる。
References
- ^ Inside Java. 「Quality Outreach Heads-up - JDK 23: Changes Default Annotation Processing Policy – Inside.java」. https://inside.java/2024/06/18/quality-heads-up/, (参照 24-06-20).
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
- 3分でWEBサイトを作れる「Wegic」を使ってみた。料金プランや具体的な使い方を詳しく解説
- 技術伝承の現実的な課題とは?DXを活用した効果的な解決方法を紹介
- DXのアイデア出しには何が必要?役立つフレームワークも併せて紹介
- 【3人に1人】DXが進まないことによる離職を検討。会社に求めるDXとは
- 【趣味回】国内No.1のWeb3.0メタバース「XANA」を使ってみた。世界規模のフェス「XANA SUMMIT」の詳細も併せて紹介