Eclipseじゃ通るけどantのjavacタスクじゃ通らない記述

Eclipseコンパイラってjavacと互換性ないのね。。。
同一マシンで同一JavaVMでも動作しやがらねぇ。
Write Once Run Anywereの精神はどこにいきやがりやったのでしょう?

今日はEclipseIEに見えました。(T_T)

その1.アノテーションで配列のメタデータを持つ場合の表記方法

@jp.xxx.framework.Yyy(
    entity="Hogehoge",
    groups= {
        @jp.xxx.framework.Yyy.Zzz(properties={
            "pogepoge",
        }),
        @jp.xxx.framework.Yyy.Zzz(properties={
            "foo",
            "bar",
        }),
    }
)

見たいな書き方をすると、Eclipseでは通るけど、antのjavacではエラー。
配列がカンマで終わる場合は駄目らしいです。
自動生成で吐いてたコードで、面倒だったし、動いていたから無視してましたが、
やられた感200%です。

でも、

String[] array = new String[]{"aaa", "bbb",};

という記述はどっちもOK!

訳わからん。

その2.アノテーションが無名clinit(?)を持つとエラー

public @interface Hoge {
    public static String HOGE = new String("XXX");
}

と書くと、これもEclipseはOKでantはNG
しかもたち悪いことにアノテーションを定義したクラスではなく、
アノテーションをアノテートした方に
「注釈 Hoge がありません。」とでまくりやがってくれます。
上のような書き方じゃなくて、

public @interface Hoge {
    public static String HOGE = "XXX";
}

こう書けば通ります。これはConstantPoolの初期化か、
clinitを持つかの違いなんでしょうね。

実際、

public @interface Hoge {
    static { }
}

のように明示的にclinitを持たせるとどちらもエラーです。

ただ、下のように書いた場合、

public @interface Hoge {
    public static String HOGE = new String("XXX");
}

Eclipse上ではコンパイルできて正しく動作するんで(アノテーション
クラスだから当たり前と言えば当たり前)clinitを書いてはいけないのは
単なるコンパイラだけの制限でJavaVM的な制限ではない気がする。

なんで、こんな制限つけたんでしょうね。
不便でしょうがない。

おとといきやがれですぅ(翠星石風に言ってみる)