garbagetown

個人の日記です

play! on GAE/J

唐突に謎の腹痛に見舞われてまさかの初シーズン下痢引退という憂き目に遭った我がスノーボードライフ、これがまさにウンの尽きとかうまいことを言ってはみたものの、みんなは一緒に雪山でぼくはひとり部屋の中、なんだか「下痢をしてもひとり」みたいな感じでやさぐれてきたので、現時点で play! を GAE/J で動作させる方法をまとめてみました。

失敗編

まずは 公式のドキュメント を参考にやってみます。GAE SDK 1.3.1 と Play 1.0-947 で確認した、とありますが全力で無視して全て最新版で突入。
GAE/J 上にアプリケーションを作成したら、早速始めてみましょう。以下では GAE/J アプリケーション、play! アプリケーション共に playongae という名前にします。適宜読み替えてください。
ちなみに我が家の Windows XP には play も GAE も複数バージョンが混在しているので、これらのコマンドはフルパスで実行します。

D:\work>c:\play-1.0.2.1\play new playongae
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/
~
~ play! 1.0.2.1, http://www.playframework.org
~
~ The new application will be created in D:\work\playongae
~ What is the application name? playongae
~
~ OK, the application is created.
~ Start it with : play run playongae
~ Have fun!
~

gae モジュールを使うよう application.conf を編集します。

module.gae=${play.path}/modules/gae

で、play run を実行。

D:\work>c:\play-1.0.2.1\play run playongae
(snip)
~
~ Oops,
~ Module not found: c:\play-1.0.2.1\modules\gae
~
~ You can try to install the missing module using 'play install gae'
~

Oops じゃねえよと毒づきながら play install gae を実行。

D:\work>c:\play-1.0.2.1\play install gae
(snip)
~
~ Will install gae-1.0.2
~ This module is compatible with: Tested with GAE SDK 1.3.1 and Play 1.0-947
~ Do you want to install this version (y/n)? y
~ Installing module gae-1.0.2...
~
~ Fetching http://www.playframework.org/modules/gae-1.0.2.zip
~ [--------------------------100%-------------------------] 3440.4 KiB/s
~ Unzipping...
~
~ Module gae-1.0.2 is installed!
~ You can now use it by add adding this line to application.conf file:
~
~ module.gae=${play.path}/modules/gae-1.0.2
~

インストールパスが先ほど application.conf に指定したものと違うのでこれを修正。

module.gae=${play.path}/modules/gae-1.0.2

もう一度 play run を実行。

D:\work>c:\play-1.0.2.1\play run playongae
(snip)
~
~ Ctrl+C to stop
~
Listening for transport dt_socket at address: 8000
17:30:24,127 INFO  ~ Starting D:\work\playongae
17:30:24,157 INFO  ~ Module gae is available (C:\play-1.0.2.1\modules\gae-1.0.2)
17:30:26,811 WARN  ~
17:30:26,811 WARN  ~ Google App Engine module
17:30:26,811 WARN  ~ ~~~~~~~~~~~~~~~~~~~~~~~
17:30:26,821 WARN  ~ No Google App Engine environment found. Setting up a development environement
17:30:26,961 WARN  ~ Don't forget to define your GAE application id in the 'war/WEB-INF/appengine-web.xml' file
17:30:26,971 WARN  ~
17:30:26,971 WARN  ~ You're running Play! in DEV mode
17:30:28,503 INFO  ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...
17:30:44,837 INFO  ~ Application 'playongae' is now started !

playongae/war/WEB-INF/appengine-web.xml が作成されるので、application の名前を指定する。ふつうは GAE/J アプリケーションと play! アプリケーションの名前は同じにすると思うので、デフォルトで設定してくれても良さそうなものですが、まあ文句言う暇があるならパッチを書けって話ですね、はい。

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
	<application>playongae</application>
	<version>1</version>
</appengine-web-app>

で、GAE SDK 1.3.3 を指定して play gae:deploy を実行。

D:\work\playongae>c:\play-1.0.2.1\play gae:deploy --gae c:\appengine-java-sdk-1.3.3\
(snip)
~
~
~ Compiling
~ ---------
17:35:48,533 INFO  ~ Starting D:\work\playongae
17:35:48,544 INFO  ~ Module gae is available (C:\play-1.0.2.1\modules\gae-1.0.2)
17:35:50,797 WARN  ~
17:35:50,797 WARN  ~ Google App Engine module
17:35:50,797 WARN  ~ ~~~~~~~~~~~~~~~~~~~~~~~
17:35:50,807 WARN  ~ No Google App Engine environment found. Setting up a development environement
17:35:50,887 WARN  ~
17:35:50,887 INFO  ~ Precompiling ...
17:36:02,293 INFO  ~ Done.
~
~ Packaging
~ ---------
~ Packaging current version of the framework and the application to c:\docume~1\xxx\locals~1\temp\pl
ayongae.war ...
~
~ Deploying
~ ---------
~
~ Done!
~

Done! と表示されますが、実際には appcfg.sh が関連付けされたエディタで開かれるだけで、アプリケーションはデプロイされません。これは バグレポートに上がっている事象 で、やはり最新版ではまだ無理と言うことが分かりました。

苦悩編

play! を GAE/J で動作させるには

  • play! のバージョン
  • gae モジュールのバージョン
  • GAE SDK のバージョン

が関係してくるようなのですが、play! は 1.0, 1.0.1, 1.0.2, 1.0.2.1 があって gae は 1.0, 1.0.1, 1.0.2 があって GAE SDK に至っては 1.3 系だけでも 1.3.0, 1.3.1, 1.3.2, 1.3.3, 1.3.3.1 があるので、これら全部の組み合わせっつったらいくつ? 4 * 3 * 5 = 60 通り?当たってる?違ってる?バカ!もう知らない!みたいな感じで頭痛がしそうになるも腹痛に打ち消されて、トイレとパソコン部屋を行ったり来たりしている間に

  • play! 1.0.1
  • gae 1.0.1
  • GAE SDK 1.3.2

の組み合わせで正常に動作することを確認しました。

成功編

というわけで、今度は gae 1.0.1 のドキュメント を参考にやってみます。
まずは play 1.0.1 で playongae を new します。

D:\work>c:\play-1.0.1\play new playongae
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/
~
~ play! 1.0.1, http://www.playframework.org
~
~ The new application will be created in D:\work\playongae
~ What is the application name? playongae
~
~ OK, the application is created.
~ Start it with : play run playongae
~ Have fun!
~

gae モジュールを使うよう application.conf を編集。play 1.0.1 には gae 1.0.1 が "gae" という名前で同梱されています。

module.gae=${play.path}/modules/gae

play run して appengine-web.xml を作る。

D:\work>c:\play-1.0.1\play run playongae
(snip)
~
~ Ctrl+C to stop
~
Listening for transport dt_socket at address: 8000
11:42:32,794 INFO  ~ Starting D:\work\playongae
11:42:32,814 INFO  ~ Module gae is available (C:\play-1.0.1\modules\gae)
11:42:35,448 WARN  ~
11:42:35,448 WARN  ~ Google App Engine module
11:42:35,448 WARN  ~ ~~~~~~~~~~~~~~~~~~~~~~~
11:42:35,448 WARN  ~ No Google App Engine environment found. Setting up a development environement
11:42:35,558 WARN  ~ Don't forget to define your GAE application id in the 'war/WEB-INF/appengine-web.xml' file
11:42:35,568 WARN  ~
11:42:35,568 WARN  ~ You're running Play! in DEV mode
11:42:37,501 INFO  ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...

application の名前を編集。

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    <application>playongae</application>
    <version>1</version>
</appengine-web-app>

ここからが先ほどの手順とちょっと変わって、play war コマンドで playongae アプリケーションを JEE ディレクトリ構成に沿った web アプリケーションとして吐き出します。

D:\work>c:\play-1.0.1\play war playongae -o playongae.war
(snip)
~
~ Packaging current version of the framework and the application to D:\work\playongae.war ...
~ Done !
~
~ You can now load D:\work\playongae.war as a standard WAR into your servlet container
~ You can't use play standard commands to run/stop/debug the WAR application...
~ ... just use your servlet container commands instead
~
~ Have fun!
~

で、GAE SDK 1.3.2 の appcfg コマンドに update オプションを指定して、対象には先ほど吐き出した web アプリケーションディレクトリを渡します。

D:\work>c:\appengine-java-sdk-1.3.2\bin\appcfg.cmd update playongae.war
********************************************************
There is a new version of the SDK available.
-----------
Latest SDK:
Release: 1.3.3
Timestamp: Wed Apr 21 00:20:51 JST 2010
API versions: [1.0]

-----------
Your SDK:
Release: 1.3.2
Timestamp: Thu Mar 18 04:19:29 JST 2010
API versions: [1.0]

-----------
Please visit http://code.google.com/appengine for the latest SDK.
********************************************************
Reading application configuration data...
2010/04/27 11:46:50 com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
情報: Successfully processed playongae.war\WEB-INF/appengine-web.xml
2010/04/27 11:46:50 com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
情報: Successfully processed playongae.war\WEB-INF/web.xml
Beginning server interaction for playongae...
0% Creating staging directory
5% Scanning for jsp files.
20% Scanning files on local disk.
25% Initiating update.
28% Cloning 118 application files.
31% Cloned 100 files.
40% Uploading 2 files.
52% Uploaded 1 files.
61% Uploaded 2 files.
68% Initializing precompilation...
90% Deploying new version.
95% Will check again in 1 seconds
98% Will check again in 2 seconds
99% Will check again in 4 seconds
99% Will check again in 8 seconds
99% Will check again in 16 seconds
99% Closing update: new version is ready to start serving.
99% Uploading index definitions.

Update completed successfully.
Success.
Cleaning up temporary files...

ログを取り忘れたので上記には記載がありませんが、最初の一回は途中で認証用の email と password を聞かれるので GAE/J に登録したものを入力します。

おまけ

基本的にはこれで play! アプリケーションを GAE/J で動作させることができるのですが、喜び勇んで playongae.appspot.com にアクセスすると、こんな画面が表示されます。

明らかにスタイルシートが効いていません。実は指定しているスタイルシートそのものがデプロイしたアプリケーションに含まれていないので、play 本体から playongae アプリケーションにコピーしてやる必要があります。
上記コマンドで晒しているような環境の場合は、c:\play-1.0.1\modules\docviewer\public\playmanual を d:\work\playongae\public にディレクトリごとコピーしてから war 化してデプロイすれば OK です。

D:\work>xcopy c:\play-1.0.1\modules\docviewer\public\playmanual d:\work\playongae\public\playmanual\
C:\play-1.0.1\modules\docviewer\public\playmanual\manual.css
1 個のファイルをコピーしました

D:\work>c:\appengine-java-sdk-1.3.2\bin\appcfg.cmd update playongae.war
(snip)
~ Have fun!
~

D:\work>c:\appengine-java-sdk-1.3.2\bin\appcfg.cmd update playongae.war
(snip)
Update completed successfully.
Success.
Cleaning up temporary files...

これで playongae.appspot.com にアクセスすると

今度はちゃんとスタイルシートの効いた画面が見られます。