はじめに
Javaプロジェクトをビルド(GradleやMavenなどでコンパイル)した際、ビルド自体は成功したものの、コンソールに以下のような警告(warning)メッセージが出力されることはないでしょうか?
> Task :compileJava
src/main/java/jp/・・・/Utils.java:107: warning: [dep-ann] deprecated item is not annotated with @Deprecated
public static LocalDate firstDayOfTheMonth(LocalDateTime datetime) {
^
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
1 warning
「エラーではないようだけど、これは何?」「今すぐ直さないとマズイの?」と不安になる方もいるかもしれません。
この記事では、この [dep-ann] という警告が何を意味しているのか、具体的にコードのどこで何が起きていて、どのように対処すれば良いのかを詳細に解説します。
対象読者
- Javaで開発を行っているプログラマー(初学者〜中級者)
- ビルド時に出力される警告(warning)の意味を正しく理解し、スッキリさせたい方
- Javaの非推奨(Deprecated)の正しい使い方を知りたい方
警告メッセージは何を意味しているのか?
まず、出力されたメッセージを分解して意味を確認しましょう。
-
warning: [dep-ann] deprecated item is not annotated with @Deprecated
直訳すると「警告:非推奨アイテムに@Deprecatedアノテーションが付与されていません」となります。[dep-ann]は「Deprecated Annotation」の略です。 -
Note: Some input files use or override a deprecated API.
「注意:いくつかの入力ファイルで、非推奨のAPIを使用またはオーバーライドしています」という意味です。
つまり、コンパイラは「コメントでは『非推奨』って書いてあるのに、Javaの文法としての『非推奨マーク(アノテーション)』が付いてないよ!」と親切に教えてくれているのです。
具体的に何が起こっているのか?
この警告が発生する原因は、「Javadoc(コメント)」と「Javaアノテーション」の不整合です。
Javaには「このメソッドは古いからもう使わないでね」と伝えるための手段が2つあります。
-
Javadocのタグ:
/** @deprecated 代替メソッドを使ってね */(小文字から始まる) -
アノテーション:
@Deprecated(大文字から始まる)
今回の警告が出ているコードは、以下のような状態になっています。
❌ 警告が出るコードの具体例
public class Utils {
/**
* 月の初日を取得します。
*
* @deprecated このメソッドは非推奨です。代わりに xxx を使用してください。
*/
// ↓ ここに @Deprecated アノテーションが無い!
public static LocalDate firstDayOfTheMonth(LocalDateTime datetime) {
// メソッドの処理...
return datetime.toLocalDate().withDayOfMonth(1);
}
}
コメント(Javadoc)には @deprecated と書かれているのに、メソッド自体には @Deprecated アノテーションが付いていません。このチグハグな状態を検知して、コンパイラが警告を出しているのです。
どうすればいいのか?(対応方法)
結論:今すぐ対応しなくてもプログラムは動く
これはあくまで「警告(warning)」であり、「エラー(error)」ではありません。コンパイルは正常に完了しており、プログラムの動作自体に影響はないため、今すぐ急いで直さなければならない緊急性はありません。
ただし、放置すると警告ログがノイズになり、本当に重要なエラーを見落とす原因になるため、時間がある時に以下のいずれかの方法で修正することをおすすめします。
対応パターンA:本当に非推奨(Deprecated)にしたい場合
このメソッドを本当に「今後使ってほしくない(非推奨)」とする場合は、メソッドの直前に @Deprecated アノテーションを追記します。
public class Utils {
/**
* 月の初日を取得します。
*
* @deprecated このメソッドは非推奨です。代わりに xxx を使用してください。
*/
@Deprecated // ← これを追加する!
public static LocalDate firstDayOfTheMonth(LocalDateTime datetime) {
return datetime.toLocalDate().withDayOfMonth(1);
}
}
アノテーションを付けることで、このメソッドを呼び出している別のクラス側でも、IDE(EclipseやIntelliJなど)上でメソッド名に打ち消し線(firstDayOfTheMonth)が引かれるようになり、他の開発者に正しく「非推奨であること」が伝わります。
対応パターンB:誤って Javadoc に書いていただけの場合
「実は非推奨にするつもりはなかった(過去の開発者が間違えてコメントに書いただけ)」という場合は、Javadoc内の @deprecated の記述を削除します。
public class Utils {
/**
* 月の初日を取得します。
* (@deprecated の行を削除、または説明を修正する)
*/
public static LocalDate firstDayOfTheMonth(LocalDateTime datetime) {
return datetime.toLocalDate().withDayOfMonth(1);
}
}
どちらの対応を行っても、次回以降のコンパイル(Task :compileJava)でこの警告は消えます。
最後に
[dep-ann] 警告は、「コメントとコードの実態が合っていないよ」というコンパイラからの親切な指摘です。
エラーではないため焦る必要はありませんが、正しいアノテーション(@Deprecated)を付与することで、IDEの強力なサポート(打ち消し線での警告など)を受けられるようになります。
チーム開発において「使ってほしくない古いメソッド」を安全に減らしていくためにも、警告を見つけたら適切な状態に修正する癖をつけておくと良いでしょう。
