この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

GuavaをGWTで使う

最近、GWTを始めました。

で、今日のお題です。


いまGWTのモジュールを作っているところなのですが、google-collectionsが使いたくなりました。
ところがgoogle-collectionsのホームページによると、Guavaを使え、とのこと。はあ、そうですか。


で、ivyで次のように書くとguavaのjarが落ちてくる。

<dependency org="com.google.guava" name="guava" rev="latest.release" />

さすればGuavaのクラスが使えるようになったので、GWTでフツーにコーディング。


。。。ここでハタと気がついた。

gwt.xmlにどのようなinheritエントリを追加すればいいんだ?』

そう、GWTのモジュールを定義する際にはgwt.xmlという定義ファイルを用意する必要があるのですが、
外部モジュールを使う場合、適切なエントリを追加してやらないとマトモに動きません。こんな感じ。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.1.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.1.0/distro-source/core/src/gwt-module.dtd">
<module>
    <inherits name="com.google.gwt.user.User" />

    <inherits name="com.google.common.base.Base" /> ←コレを使いたい
</module>


今回使ったのはcom.google.common.base.Stringsクラスです。
ということは、たぶんguava.jarの中にBase.gwt.xmlというファイルがあるのでは。。。無い!?


おいおい、どーすんだコレ。

どうやら

guava-gwt.jarというjarが追加で必要なようです(2011-01-08時点の最新版は"guava-r07-gwt.jar")。
で、この中にgwt.xmlが入ってます。


タチの悪いことにこのファイル、Mavenリポジトリに登録されていないようです。
従って、Mavenのローカルリポジトリへ手動でンストールする必要があります。メンドクセー。

さすがにいい加減動けよコラ。

と思ったのですが、今度はこんなエラーが大量に出ます。

[DEBUG] [gwtsample.SamplePage] - Validating newly compiled units
	[ERROR] [gwtsample.SamplePage] - Errors in 'jar:file:/.ivy2/cache/com.google.guava/guava-gwt/jars/guava-gwt-r07.jar!/com/google/common/base/Equivalence.java'
		[ERROR] [gwtsample.SamplePage] - Line 20: The import javax.annotation cannot be resolved
		[ERROR] [gwtsample.SamplePage] - Line 56: Nullable cannot be resolved to a type
		[ERROR] [gwtsample.SamplePage] - Line 56: Nullable cannot be resolved to a type
		[ERROR] [gwtsample.SamplePage] - Line 65: Nullable cannot be resolved to a type
		...

どうやら、GuavaのクラスをGWTコンパイルする際に、
それらが参照しているNullableアノテーションのクラス&ソースコードが必要な模様です。


で、それはここにあります。jsr305.jarというのがそれ。


http://code.google.com/p/guava-libraries/source/browse/trunk/lib/jsr305.jar?r=146


またMavenローカルリポジトリへインストールして、実行。ああメンドクサイ。

(#゚Д゚)ゴルァ!!

まだ同じエラーが出ます。(Nullable cannot be resolved to a type)


どうやら、GWTの開発ツール(デバッガみたいなヤツ)の起動クラスパスにも、
先程のjsr305.jarを追加してやらなければならないようです。


Eclipseの『実行の構成→(GWTの開発ツール)→ユーザー・エントリー』に、jsr305.jarを追加。(一番上の赤丸)


パッと見、起動しているプロジェクトがクラスパスに入っていても(ユーザー・エントリの一番下)、
ダメのようです。明示的にjarを追加してやる必要があります。

やっと

動きました。あーメンドクサ。guava-r08では解消されていることを切に祈ります。

2011-01-18追記

guava-gwt.jarがMavenリポジトリに存在しない問題は、どうやら近日中に対応される模様です。
http://code.google.com/p/guava-libraries/issues/detail?id=501