gwt-gadgetでビルドできない問題。整理してみる
gwtquery-1.0.0 を使いたいんだけど、gwtquery-1.0.0-SNAPSHOTを今でも仕方なく使い続けている。理由は、gwt-gadget1.2.0がGWT2.2以上でビルドしたものを扱えないからっぽい。以下のようなエラーが出てビルドできない。
java.lang.IncompatibleClassChangeError: Found interface com.google.gwt.core.ext.typeinfo.JClassType, but class was expected
これがgwt-query-1.0.0-SNAPSHOTだとビルドが通る。JClassTypeはGWT2.1.1ではabstract classで、GWT2.2.0ではinterface に変わってしまった。これにより扱う側がextendsするかimplementsするかでソースが変わってしまうため、ビルドができなくなったようだ。しかしオリジナルのgwtquery-1.0.0-SNAPSHOTのあるリポジトリは消されてしまった。
それではと、gwt-gadget-1.2.1-r1を試してみた。途中deprecatedっぽいワーニングは出るものの、IncompatibleClassChangeErrorは発生せずにビルドが最後までいこうとするので、1.2.1-r1がGWT2.2.0以降に対応したと思われる。しかしビルドの最後の最後で、「gwt.xmlで、<script>定義するんじゃないよー!」と、ちゃぶ台返しされる。GWT2.1.1+gwt-gadget1.2.0ではライブラリでjsを使っていても大丈夫だったのに。
Linking into /Users/katochin/Documents/workspace/myapp/war/myapp Invoking Linker Google Gadget Building gadget manifest [ERROR] The Google Gadget linker does not support <script> tags in the gwt.xml files [ERROR] Failed to link com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries) at com.google.gwt.core.linker.CrossSiteIframeLinker.fillSelectionScriptTemplate(CrossSiteIframeLinker.java:79)
このCrossSiteIframeLinkerクラスは、GWTに含まれるもので、GWT2.2.0だけでなくGWT2.1.1にも含まれていた。しかしどうも実装が変わってしまったようだ。もしかするとgwt-gadgetのコンパイラが面倒を見なければならなくなったのかもしれない(それをgwt-gadget側がScriptのありかを提供していないために起きているように見える)。
それにしてもどうしたもんかなぁ。いつまでも古いGWTを使うわけにもいかないし。頑張ってgwt.xmlのscriptの記述をGWTコード内で書くのが良いのだろうか?