2012年4月3日

軽量フレームワーク「Play」GAEにデプロイ最短手順・2012最新版


Javaの軽量WebフレームワークPlay。EclipseやGoogle App Engineとの相性もだいぶこなれ、インストールやデプロイもかなり容易になってきました。Eclipseの環境を整えてPlayアプリをGoogle App Engineにデプロイするまでの最短の手順を説明します。



検証環境


検証に使ったのはPlay 1.2.4です。GAEモジュールはPlay 2.0に対応していないので、残念ながら2.0系ではまだGAEを使うことはできないようです。


Java SE 7u1
Java EE 6
Eclipse 3.7.1+Pleiades 1.3.3
Play 1.2.4
Google App Engine SDK 1.6.3.1
Play GAEモジュール 1.6.0

目次

とりあえず手順だけ知りたい人はこちら
JavaEE SDKがインストールされていない人はここから(※Java SEでは不足なので注意)
Eclipseがインストールされていない人はここから
Playがインストールされていない人はここから
Google App Engine SDKがインストールされていない人はここから
PlayのGAEモジュールがインストールされていない人はここから
PlayをEclipseで使いたい人はこちら
うまく行かないときはこちら

最短の手順だけ知りたい人向け

環境を整える

Java EE

  ここからダウンロード

Play

  ここからダウンロード

Google App Engine SDK

  ここからダウンロード

Play GAEモジュール

> play install gae

手順


1. アプリケーション作成を作成します。

> play new AppName

2. conf/dependencies.ymlを修正

require:
  - play -> gae 1.6.0
という行を追加します。

3. 依存関係の構成

> play deps

4. Eclipseプロジェクト化し、Eclipseに取り込みます。この手順はやらなくてもかまいません。


> play eclipsify AppName

5. 一度Playを実行します。

※Eclipse上から同等の操作(Playのローカルサーバ実行)をおこなっても、マニフェストファイル(war/WEB-INF/appengine-web.xml)がどういうわけだか作成されません。コマンドラインから実行しましょう。

> play run
> Ctrl+C

6. マニフェストファイルを修正します。

一回実行すると、war/WEB-INF/appengine-web.xmlというファイルが作成されます。

このファイルを次のように修正します。

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

<application>に指定するのは、Google App EngineのApplication Identifierです。



管理コンソール https://appengine.google.com/ にアクセスし、アプリケーション名をクリックします。左上にApplication Identifierが表示されています。

7. GAEにデプロイ

> play gae:deploy --gae=c:\Develop\Java\appengine-java-sdk-1.6.3.1

--gaeオプションは、Google App Engine SDKを展開した場所を指定します。毎回指定するのは面倒な場合は、環境変数をセットしておくこともできます。

GAE_PATHという環境変数にGoogle App Engine SDKのパスを指定しておくと、--gaeオプションが不要になります。

Java EE SDKをインストール

[前提条件]

特になし

Google App Engineを使うには、Java SEだけではなくJavaEEが必要です。Playを使うだけならJavaEEは不要です。

Oracleのサイトから最新のJavaEE SDKをインストールします。

ここでの注意は、Java SEとJavaEE SDKとは別のもので、Java SEとJavaEE SDKの両方をインストールしなければいけない点です。(しかも、Java SEのバージョンは7なのにJavaEE SDKのバージョンは6というややこしさ)

ダウンロードページはここ↓
http://www.oracle.com/technetwork/jp/java/javaee/downloads/index.html




もしJava環境がいっさい入っていない場合は、左端の「Java EE6 SDK with JDK 7」を選びます。

Java SEはすでにインストールされている人は、真ん中の「Java EE 6 SDK」を選びます。

Eclipseをインストール

[前提条件]

JavaEE SDKがインストールされていること

Eclipseをダウンロードします。Eclipseも非常にたくさんのパッケージがありますが、今回のケースで必要なのは、「Eclipse IDE for Java EE Developers」というパッケージです。

Eclipse IDE for Java EE Developersのダウンロードページはこちらです。
http://eclipse.org/downloads/



ダウンロードしたらインストーラでインストールします。Java SDKの場所などはインストーラが見つけ出してくれます。

日本語化を含めたインストール・設定の手順は以下のページが詳しいです。
http://www.kkaneko.com/rinkou/javaintro/eclipse.html

Playをインストール

[前提条件]

Java EE SDKがインストールされていること
Eclipseがインストールされていること

ダウンロードはこちら↓
http://www.playframework.org/



Play 2.0がリリースされてしまったので、Playのサイトは2.0一色です。1.x系のバージョンをダウンロードするには、"all versions"というリンクからたどる必要があります。

しかしインストールは簡単です。ダウンロードしたら展開するだけで、インストール作業などは要りません。

それから、インストールフォルダの直下にパスを通しておきましょう。

Google App Engine SDKをインストール

[前提条件]

Java EE SDKがインストールされていること
Eclipseがインストールされていること

ダウンロードはこちらから↓
https://developers.google.com/appengine/downloads?hl=ja#Google_App_Engine_SDK_for_Java

Playと同様、ダウンロードしたら展開するだけです。

PlayのGAEモジュールをインストール

[前提条件]

Java EE SDKがインストールされていること
Eclipseがインストールされていること
Playがインストールされていること

手動でダウンロードする必要はありません。playコマンドを使ってインストールができます。

> play install gae

これでGAEモジュールをダウンロードして、モジュールとしてインストールしてくれます。最新バージョンも判断してくれます。

Eclipseを使ったPlayアプリケーション開発

play eclipsifyコマンド

Playには、Eclipseでの利用を前提としたeclipsifyというコマンドがあります。

生成したアプリケーションディレクトリに移動して次のコマンドを実行します。

> play eclipsify

これでEclipseのプロジェクトが作成されました。

Eclipseのワークスペースに読み込むには次のようにします。
  1. メニューから「ファイル」>「インポート」を選択
  2. 「一般」>「既存プロジェクトをワークスペースへ」を選択
  3. アプリケーションディレクトリを選択し、「完了」をクリック

Eclipse Playプラグイン

Play用Eclipseプラグインは、Playの配布物の中に含まれています。

${play.path}\support\eclipse\org.playframework.playclipse_0.7.0.jar

というファイルです。これを

${eclipse.path}\dropins

というディレクトリにコピーして、Eclipseを再起動するだけです。

メニューに「再生!」という項目が表示されれば、インストールは成功しています。それにしても「再生!」ってアンタ。



実行とデバッグ

1. Playサーバを実行

まず、ローカルマシンでPlayサーバを実行します。

eclipse/AppName.launcheというファイルがありますので、右クリックして「実行」>「AppName」を選択します。

コンソールに

Listening for transport dt_socket at address: 8000
20:31:09,440 INFO  ~ Starting D:\Projects\eclipse\workspace\AppName
20:31:09,448 INFO  ~ Module gae is available (D:\Develop\Java\play-1.2.4\modules\gae-1.6.0)
20:31:10,548 WARN  ~ You're running Play! in DEV mode
20:31:10,725 INFO  ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...

と表示されれば起動できています。試しにブラウザに

http://localhost:9000/

と入力して、ページが表示されることを確認しておきましょう。

2.デバッガを接続

JPDA(Java Platform Debug Architecture)を使って、Playサーバにデバッグ接続します。

eclipse/Connect JPDA to AppName.launchというファイルを右クリックし、「デバッグ」>「AppName」を選択します。

表面的には特に何も起きませんが、これでデバッガがPlayサーバに接続しています。

試しに、Application#index()メソッドのrender()行にブレークポイントを設定して、もう一度

http://localhost:9000/

にアクセスしてみましょう。すると、下の図のようにブレークして止まってくれます。


うまく行かないときは

慣れてしまえば異様に簡単な手順なのですが、慣れるまではこまごました作業を見落としがちです。

うまくいかないときは、たいてい何かの作業を忘れています。

最後に、こうした忘れがちな作業をまとめておきます。

gae:deployに--gaeオプションを指定しましたか?
環境変数GAE_PATHを設定しましたか?
dependencies.ymlに依存関係を記述しましたか?
play depsを実行しましたか?
appengine-web.xmlにApplication Identifierを記述しましたか?

変なエラーが出た

僕の環境はDドライブにEclipseのワークスペースを置いてあるのですが、デプロイ(play gae:deploy)の実行時に次のような変てこなエラーが出ました。

Traceback (most recent call last):
  File "D:\Develop\Java\play-1.2.4\play", line 153, in 
    status = cmdloader.commands[play_command].execute(command=play_command, app=play_app, args=remaining_args, env=play_env, cmdloader=cmdloader)
  File "D:\Develop\Java\play-1.2.4\modules\gae-1.6.0\commands.py", line 222, in execute
    package_as_gae_war(app, env, war_path, None)
  File "D:\Develop\Java\play-1.2.4\modules\gae-1.6.0\commands.py", line 54, in package_as_gae_war
    if isParentOf(app.path, war_path):
  File "D:\Develop\Java\play-1.2.4\framework\pym\play\utils.py", line 38, in isParentOf
    relpath = os.path.relpath(path1, path2)
  File "D:\Develop\Java\play-1.2.4\python\lib\ntpath.py", line 488, in relpath
    % (path_list[0], start_list[0]))
ValueError: path is on drive D:, start on drive c:

これは、次のようにntpath.pyというファイルの以下の箇所を書き換えれば回避できます。書き換えることによる影響はありません。

${play.path}\python\lib\ntpath.py:
484:        else:
485:            raise ValueError("path is on drive %s, start on drive %s"
486:                                                % (path_list[0], start_list[0]))

↓以下のようにコメントアウトする
484:        #else:
485:        #    raise ValueError("path is on drive %s, start on drive %s"
486:        #                                        % (path_list[0], start_list[0]))

0 コメント:

コメントを投稿

長崎県 引越 見積もり 単身引っ越し 料金 還暦祝い 父 Blog Entry Ranking
" ); 出会い系を例示