garbagetown

個人の日記です

play! on eclipse

play! は java web アプリケーションフレームワークであり、当然、開発には java 言語を使います*1
play! の オフィシャル にあるスクリーンキャストでは TextMate を使っていますが、java 開発者は eclipse に慣れていることが多いので、play! には eclipse での開発を容易にするツールがいくつか用意されています。

eclipsify

play! アプリケーションを eclipse プロジェクト化する eclipsify コマンドが用意されています。
まずはヘルプを参照してみます。

D:\work>play help eclipsify
~        _            _
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/
~
~ play! 1.0.2.1, http://www.playframework.org
~
~ Name:
~ ~~~~~
~ eclipsify -- Create all Eclipse configuration files
~
~ Alias:
~ ~~~~~
~ ec
~
~ Synopsis:
~ ~~~~~~~~~
~ play eclipsify [app_path]
~
~ Description:
~ ~~~~~~~~~~~~
~ Create all needed configuration file to make the application hosted at the app_path directory an Eclipse project.
~ If app_path is omitted, the current directory is used.
~
~ All needed configuration files including .project and .classpath are created.
~ Several launchers for the application are created as well. The main launcher in usable either with the Run and
~ Debug Eclipse command. The JPDA launcher is only usable with the Run command since it already starts a JPDA agent.
~ You can then use the Connect JPDA launcher to start a debugging session at any time. Stopping the debugging session
~ will not stop the server.
~
~ Use File/Import/General/Existing project to import the project into Eclipse.
~
~ Use eclipsify again when you want to update Eclipse configuration files. It's needed after any classpath change.
~ However, it's often better to delete and re-import the project into your workspace since Eclipse keeps dirty caches...
~
~ The created configuration file contains absolute references to your application, the Play framework and all enabled modules.
~ These are specific to your own installation. When you work in a team, each developer must keep his IDE configuration files private.
~

地味にいろいろと重要なことが書いてありますが、細かいことは追々見ていくとして、まずは実践してみましょう。
以下では実験に使用するアプリケーション名を eclipsetest とします。変更する場合は適宜読み替えてください。
まずは play new で play! アプリケーションを作成します。

D:\work>play new eclipsetest
(snip)
~
~ The new application will be created in D:\work\eclipsetest
~ What is the application name? eclipsetest
~
~ OK, the application is created.
~ Start it with : play run eclipsetest
~ Have fun!
~

作成されたアプリケーションの内容は以下のようになります。

D:\work>tree /F eclipsetest
(snip)
D:\WORK\ECLIPSETEST
├─app
│  ├─controllers
│  │      Application.java
│  │
│  ├─models
│  └─views
│      │  main.html
│      │
│      ├─Application
│      │      index.html
│      │
│      └─errors
│              404.html
│              500.html
│
├─conf
│      application.conf
│      messages
│      routes
│
├─lib
├─public
│  ├─images
│  │      favicon.png
│  │
│  ├─javascripts
│  │      jquery-1.4.2.min.js
│  │
│  └─stylesheets
│          main.css
│
└─test
        Application.test.html
        ApplicationTest.java
        BasicTest.java
        data.yml

で、これを eclipsify してやると

D:\work>play eclipsify eclipsetest
(snip)
~
~ OK, the application is ready for eclipse
~ Use File/Import/General/Existing project to import D:\work\eclipsetest into eclipse
~
~ Use eclipsify again when you want to update eclipse configuration files.
~ However, it's often better to delete and re-import the project into your workspace since eclipse keeps dirty caches...
~

こうなります(変更が無い箇所は省略します)。

D:\work>tree /F eclipsetest
(snip)
D:\WORK\ECLIPSETEST
│  .classpath
│  .project
│
├─.settings
│      org.eclipse.core.resources.prefs
│      org.eclipse.jdt.core.prefs
(snip)
├─eclipse
│  │  .classpath
│  │  .project
│  │  Connect JPDA to eclipsetest.launch
│  │  eclipsetest.launch
│  │  Test eclipsetest.launch
│  │
│  └─.settings
│          org.eclipse.core.resources.prefs
│          org.eclipse.jdt.core.prefs
(snip)

なんだか色々できています。続いてこいつを eclipse に取り込んでみましょう。
eclipse を起動して java パースペクティブを開いたら、File->Import->General->Existing Project into Workspace と進み、作成したプロジェクトのルートディレクトリを指定します。

これで eclipse の自動補完やリファクタリングなどの強力な機能を使いながら play! の開発を行うことができるようになりました。

eclipsetest.launch

play! の開発は基本的に開発用サーバを起動したまま行います。コマンドプロンプトから play run を実行して開発サーバを起動してもよいのですが、eclipsetest.launch を使用すれば eclipse から開発用サーバを起動することができます。
パッケージエクスプローラで eclipsetest.launch を選択し、コンテキストメニューから Run As->eclipsetest を選択します。

eclipse コンソールに

INFO  ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...

と表示されれば開発サーバの起動は完了です。ブラウザから localhost:9000 を開けば play! アプリケーションにアクセスすることができます。

Connect JPDA to eclipsetest.launch

eclipse の強力な機能の一つに、分かり易く使い易いデバッガがあります。JPDA (Java Platform Debugger Architecture) を使用することで eclipse デバッガから play! アプリケーションに接続することができます。
作成したばかりのコントローラにはブレークポイントを仕掛ける場所が無いので、適当なコードを追加します。

package controllers;

import play.mvc.*;

public class Application extends Controller {

    public static void index() {
    	int sum = 0;
    	for (int i = 0; i < 100; i++) {
    		sum += i;
    	}
        render();
    }
}

例えば for ループの中身などにブレークポイントを設定したら、パッケージエクスプローラで Connect JPDA to eclipsetest.launch を選択し、コンテキストメニューから Debug As->Connect JPDA to eclipsetest を選択します。

この状態でブラウザをリロードすると eclipse デバッガが起動し、通常通りステップインやステップオーバー、変数の閲覧や変更などが行えます。

デバッグ作業を終えたら JPDA 接続を切断します。マニュアル によると、JPDA を繋いだままコードを変更するとブレークポイントの場所がズレたりするので、デバッグの都度、接続と切断を行った方が無難とのことです。

なお、このとき開発サーバを停止する必要はありません。

Test eclipsetest.launch

最後はテストサーバの起動です。通常は play test コマンドで起動するテストサーバも eclipse から起動することができます。
パッケージエクスプローラで Test eclipsetest.launch を選択し、コンテキストメニューから Run As->Test eclipsetest を選択します。

eclipse コンソールに

INFO  ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...

と表示されれば開発サーバの起動は完了です。ブラウザから localhost:9000/@tests を開けばテストランナーにアクセスすることができます。

playclipse

play! には playclipse という eclipse プラグインも同梱されています。

  • %PLAY_HOME%\support\eclipse\org.playframework.playclipse_0.6.0.jar

インストール方法は非常に単純で、この jar ファイルを%ECLIPSE_HOME%\dropins ディレクトリにコピーして eclipse を再起動するだけです。

正常にインストールされると、メニューバーに "Play!" メニューが追加されます。また、ボタンバーにはコントローラ、モデル、ビューを作成するボタンや routes を表示するボタンが追加されます。
コントローラの render() メソッドをフォーカスした状態で Ctrl + Alt + V で対応するビューを開けるなどのショートカットも一応用意されていますが、肝心のビューエディタは現在のところ日本語が文字化けするようです。

tips

最後に play help eclipsify で表示された地味に重要な情報をふり返ってみましょう。

  • eclipsify のエイリアスは ec
  • eclipsify の対象ディレクトリを省略した場合はカレントディレクトリが指定される
  • ライブラリを追加するなどしてクラスパスを更新した場合は再度 eclipsify が必要
  • 作成される設定ファイルには play! そのものやモジュールへの絶対パスが含まれるのでコミットしてはいけない

*1:play 1.1 からは scala も使えます