Eclipseじゃ通るけどantのjavacタスクじゃ通らない記述
Eclipseのコンパイラってjavacと互換性ないのね。。。
同一マシンで同一JavaVMでも動作しやがらねぇ。
Write Once Run Anywereの精神はどこにいきやがりやったのでしょう?
その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的な制限ではない気がする。
なんで、こんな制限つけたんでしょうね。
不便でしょうがない。
おとといきやがれですぅ(翠星石風に言ってみる)