読者です 読者をやめる 読者になる 読者になる

たぷつきません

おなかがでてきた。もうたぷついてるやん。

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コード内で書くのが良いのだろうか?

追記

 ちなみにgwt-gadget-1.2.1-r1もGWT2.3.0でビルドしたら、IncompatibleClassChangeErrorになる。要するにGWTのビルダーは同じバージョンのSDKでやらないとダメってことだよね。であればさ、各GWTバージョン別にgwt-gadget-1.2.0やgwt-gadget-1.2.1-r1を用意しないとダメってことじゃん!ちゃんと提供して欲しい。