今日も楽しくGoogle App Engine for JavaとGWTを色々試す。
GAE/Jは普通のRDBMS(リレーショナルデータベース管理システム)を使えずに、
Google特有のBigTableというデータベースシステムしか利用できません。
で、データを扱うために、「DataStore(データストア)」を利用するわけですが、
データをアクセスするためのインターフェースとして、
グーグルは JDO(Java Data Objects)やJPA(Java Persistence API)を推奨しています。
ここ数日、グーグルのチュートリアルに沿って、JDOを使って来ましたが、
クエリの書き方など、色々調べていましたら、
JDOはグーグルに推奨されていますが、
どうもクエリとかのパフォーマンス的にあんまり良くない…らしい。
(実はあんまり深く理解していないのですが)、
Slim3のDatastoreがイイ…という噂を聞きつけました。
赤い彗星並に、JDOの3倍以上早いらしい。
→Slim3 Datastoreに乗り換える(1)
→javaのdatastore操作は slim3 がおすすめ
それならばオラも…ということで、チャレンジしてみました。
ちなみに、Slim3と言うのはGAE/Jに向けて最適化したMVCフレームワークです。
で、Slim3 Datastoreはそのフレームワークの中の一部ですね。
フレームワークを丸ごと使うかどうかは要検討…ですが、
データアクセスが早いのは嬉しいので、とりあえずDatastoreだけを使ってみようかと。
ドキュメントとかを読むと、どうやらJDOよりも色々と高性能で、
仕組みも自然で分かりやすいし、
クエリ出来るパターンのバリエーションも多く、なかなか良いらしい。
→本家のSlim3のドキュメント(英語)
→有志が作ったSlim3 Datastoreの日本語訳
で、チュートリアル(英語)の通りにやると、
…いきなり上手くいかない。
こんな感じのエラーが出て、うまくビルドが出来ないのです…。
Buildfile: /workspace/slim3-blank/build.xml
gen-service:BUILD FAILED
/workspace/slim3-blank/build.xml:42: java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
色々調べると、どうやらこれはMac特有で、
32-bitの環境と64-bitの環境が混在している問題らしい。
チュートリアルもこんな感じのこと言っていますし、
Ant Build(first item). If you encounter an exception, confirm that you use Java 32 bit and Eclipse 32 bit.
(*もし例外を遭遇したら、java 32bitとEclipse32bitを使っているかを確認してください。)
なんか32bitのjavaとEclipseをオススメとか。
いろいろ調べると、Java6は対応していないから、
Java5をダウンロードすれば解決できるとか、そういう解決法がありましたが、
Java5を使ってもなんだか上手くいかない。
更に調べると、これは32bit版のEclipseの問題で、
64bit版のEclipseを使えば、問題を解消出来る…ことが分かりました。
→Slim3のチュートリアルでjava.lang.UnsatisfiedLinkError: Cannot load 64-bit SWT libraries on 32-bit JVM
で、自分が使っているEclipseは32bitなのか64bitか分かりませんので、
とりあえず64bit版をダウンロード、展開してみました。
ちなみにEclipseを実行してみると、元々のは32bitってことが分かりました。
↓32bitのEclipseの立ち上げ画面
↓64bitのEclipseの立ち上げ画面
http://download.eclipse.org/eclipse/downloads/から、
とりあえず最新の安定リリース(RCついてないやつ)を選んで、
その中から、「Mac OSX (Mac/Cocoa/x86_64) 」のやつを選べばよいかと。
ファイル名はこんな感じです。
「eclipse-SDK-?.?.?-macosx-cocoa-x86_64.tar.gz」
とりあえず、Mac OS の場合、64 bitのEclipseを使えば、
ビルドが出来るようになりましたので、チュートリアルを一通りやってみました。
特に大きな問題が無かったです。
で、次にSlim3のデータストアとGWT(Google Web Toolkit)との連動ですが、
ここにも問題が…。
ほぼSlim3チュートリアルの通りのデータのクラスを作って、
それをGWTのクライアントで受け取れるようにして、
GWT コンパイルすると、エラーが出ます。
↓Eclipseで出されるエラー画面
エラーメッセージはこんな感じです…。
[ERROR] Errors in ‘file:/workspace/GoogleWebToolkitSlim3/src/gwt/test/client/ServerService.java’
[ERROR] Line 17: No source code is available for type gwt.test.server.Tweet; did you forget to inherit a required module?
で、いろいろ調べると、GWTを利用する際、基本的にclientパッケージ内のクラスは、
clientパッケージ内のクラスしか利用出来ない…らしい。
(場合によってsharedパッケージも行ける。)
それならば、データのクラスをshared.modelの中に移動させました。
これでイケる!っと思いましたが、
そうしたら、こんな感じのエラーが出るようになりました。
[ERROR] Errors in ‘file:/workspace/GoogleWebToolkitSlim3/src/gwt/test/shared/model/Tweet.java’
[ERROR] Line 30: No source code is available for type com.google.appengine.api.datastore.Key; did you forget to inherit a required module?
このエラーメッセージで検索しても、なかなか解決策にたどり着きませんでした…。
分かったことと言えば、GWTはすべてのJavaライブラリを対応していないので、
対応外のライブラリを利用しようとしたら、弾かれてしまうのですね。
一応、インクルードするために、inheritsに何かを追加しないと行けないのですが、
その書き方がよく分からない…。
いや、他の例を見れば、書き方は分かるのですが、
なにをインヘリタンスすれば良いのかわからんのじゃ。
かなり根気よく色々探し回りましたら、
ようやくGWTでslim3を使うための設定法と出会いました。
→Slim3でGWTのブランクプロジェクトを作る手順
上記URLの「2010-01-27 追記」の部分で対策法が書かれていました。
{プロジェクト名}.gwt.xmlのファイルに、こんな感じの一行を追加すれば行けます。
<inherits name=’org.slim3.gwt.emul.S3Emulation’ />
場所は他のinheritsの記述、
例えば<inherits name=’com.google.gwt.user.User’ />の前後でOKです。
折角なので、上記の「Slim3でGWTのブランクプロジェクトを作る手順」に沿って、
Eclipse+GAE/J+GWT+Slim3のための環境を設定し直しました。
そうしたら、エラーも無く問題無くいろいろ実行出来ました!
これでおらもシャア並の三倍速をゲットだぜ!
いやいや、今回は超ハマってしまいました。
GWTの仕組みへの理解が不十分のは一番大きかったのですが、
ドキュメントになかなか辿り着け無かったのもしんどかったですね〜
まあ、理解が不十分なので、こんなエラーが出たのはぉぅぇぃくらい…ってことかしら。
またまたGAE/J+GWTを遊ぶぜ!