Hatena::ブログ(Diary)

あさとの @drillbits このページをアンテナに追加 RSSフィード

2010/04/13

GWT で、複数かつ個別に動作するモジュールを作ったときのメモ

モジュールgwt.xml、EntryPoint(を実装したクラス)、HTML Page でひとつのセット。
このうち、EntryPoint は複数もつことができる。

gwt.xml に、以下のように複数記述するだけで、HTML Page に対して順番に実行される。

<module>
	<entry-point class='jp.drillbits.client.Foo' />
	<entry-point class='jp.drillbits.client.Bar' />
</module>

それを踏まえて、あえて複数かつ EntryPoint の独立したモジュールを作りたいとき。
普通に考えれば各 gwt.xml にそれぞれの entry-point を書けばいいだけ。

Foo.gwt.xml

<module>
	<entry-point class='jp.drillbits.client.Foo' />
</module>

Bar.gwt.xml

<module>
	<entry-point class='jp.drillbits.client.Bar' />
</module>

ただし、GWT では gwt.xml のある階層の client パッケージ以外にあるクラスを使うときは、gwt.xml で inherit しないといけない。
上記の Foo モジュール・Bar モジュール は同じ client パッケージ配下にあるからいいのだけど、これが別だった場合…
たとえば jp.drillbits.bar.Bar で jp.drillbits.client パッケージにあるクラスを使いたい場合は以下のようになる。

Foo.gwt.xml

<module>
	<entry-point class='jp.drillbits.client.Foo' />
</module>

Bar.gwt.xml

<module>
	<inherits name='jp.drillbits.Foo' />
	<entry-point class='jp.drillbits.bar.client.Bar' />
</module>

このとき、Bar モジュールを起動させると Foo の EntryPoint も Bar モジュールHTML Page に対して実行されてしまう。
どうやら、inherits したモジュールgwt.xml に entry-point があるとそれも実行されてしまうみたいだ。

かといって、Foo モジュールは Foo モジュールで動かしたいので entry-point を消すわけにもいかない…

というわけで、Foo モジュールの EntryPoint を実装したクラス(Foo.java)に以下のように書くことで上記の問題を回避した。

package jp.drillbits.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;

public class Foo implements EntryPoint {
    @Override
    public void onModuleLoad() {
        if (!"jp.drillbits.Foo".equals(GWT.getModuleName())) {
            return;
        }
        :
        :
    }
}

ちなみに、gwt.xml で <module rename-to='foo'> のようにリネームした場合は、if (!"foo".equals(GWT.getModuleName())) です。
この方がコンパイルされたときのフォルダ名もすっきりするし、今の Eclipse Plugin でプロジェクトやモジュール作るとデフォルトリネームされてる気がする。

ytyt 2010/11/14 03:10 ありがとうございます。助かりました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/drillbits/20100413/gwt_multiple_modules