所変わればエラー変わる

NetBeans 6.0.1のプロジェクトにコンパイル済みの自作のアノテーションのクラスをライブラリィとして食わせると

Hoge.java:31: 注釈 com.hoge.FooAnotation に <clinit> がありません。

とエラーが出てそれ以上ビルドが進まない。
といえばクラスの初期化コードだが、Javaの場合アノテーションはインタフェース扱いであり、クラスの初期化コードは関係無いと思うんだが。

ひょっとして、属性のデフォルト値の設定に問題があるのか? でも一般的なビルドでもEclipseでもこんなエラー出たことないしな。

追記:

原因が判明した。やはりがあった。
アノテーションの属性には規定値(default)を設定するのだが、その規定値を定数とするために、内部にスタティックなフィールドを定義していたのだ。

@Documented
@Inherited
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface FooAnotation {
    public static final int ITEMINDEX_NAN = -1;
    〜
    int ItemIndex() default ITEMINDEX_NAN;

当該の行を他の定数クラス等に移動するとビルドが通った。

さて、ここでEclipseのビルドとNetBeansのビルドで差が出たわけだが、NetBeansのビルドはjavacをAntタスクで起動しているだけなので、Eclipseコンパイラが何か技を使っていると見るべきだろう。(javacのバグという確率も0%ではないが)

もし仮にEclipseのコンパイルが技を使っているとすれば、Eclipseでビルドしたクラスが他で動かないということになる訳で(事実NetBeansではビルドすら通らない)、とってもまずいと思うのだが。