昨日はPlay frameworkを使ってHello Worldが動きました。
今日はPlay frameworkをやるときによさそうな環境設定について書きたいと思います。
ほぼ自分向けのエントリーです。
ベースとなるEclipse(Scala IDE for Eclipse)とEmacs(ENSIME)がインストールされているものとします。
今日はPlay frameworkをやるときによさそうな環境設定について書きたいと思います。
ほぼ自分向けのエントリーです。
ベースとなるEclipse(Scala IDE for Eclipse)とEmacs(ENSIME)がインストールされているものとします。
Eclipseとの連携
Play!のコマンドで、eclipsify
というやつがあるのでこれを利用します。$ ${PLAY_HOME}/play eclipsify helloworld
実行後、プロジェクト内にEclipseの設定ファイルである
.project
.classpath
.settings
などが生成されて、「ファイル」→「インポート」でこのプロジェクトをEclipseプロジェクトとしてインポートすることができるようになります。また、
eclipse
ディレクトリが作成され、サーバーやテストの起動用の.launch
ファイルが作られます。コマンドシェルから
run
コマンドで起動していたサーバーをEclipse上で起動させることができます。eclipse/helloworld.launch
ファイルを右クリック → Run As →helloworld
Eclipseからのビルド先は
eclipse/classes
に設定されます。コンパイルエラー?
Scala IDE for EclipseのScalaのバージョンが2.8.1の場合、コンパイルエラーがでます。これは、Play!のScalaモジュール0.8のScalaのバージョンが2.8.0なので、新規に追加されたクラスが見つからないためのようです。
ほっておいても問題ないですが、気になる人はScala IDE for Eclipseが提供するScala Libraryライブラリを追加するとエラーが消えます。
Properties → Build Path → "Libraries"タブ → 「Add Library...」 → 「Scala Library」
ライブラリの並び順を
JRE System Library
の次くらいにしておくといいと思います。デバッグ
デバッグする時にはEclipseでステップ実行などができたら便利です。Eclipseから起動したサーバーであれば、後からデバッグ機能をいれこむことができます。
eclipse/Connect JPDA to helloworld.launch
ファイルを右クリック → Debug As →Connect JPDA to helloworld
「接続できました」的なメッセージは表示されませんが、
Debug
パースペクティブに新しいプロセスが表示されていると思います。この状態でブレークポイントを設定すれば、そこからステップ実行など、いつものデバッグを行うことができます。
他のIDEと連携
Eclipse以外の、NetBeansやIntelliJ IDEAなどの設定ファイルも生成できるコマンドがあります。詳しくはドキュメントを参照してください。
Emacs (ENSIME) の設定
ソースファイルの編集にはEmacs (ENSIME) を使っています。M-x ensime-conf-gen
で、設定ファイルの雛形を作っていきます。(
/path/to/helloworld
は適宜読み替えてください。)Find project root: /path/to/helloworld
Your project seems to be of type 'custom', continue with this assumption? (yes or no) yes
What is your project's name? /path/to/helloworld
What is the name of your project's main package? e.g. com.myproject:
Where is the project's source located? /path/to/helloworld/app
Where are the project's dependency jars located? /path/to/helloworld/lib
Is the Scala standard library located somewhere else? (yes or no) yes
Where are is the Scala library located? ${PLAY_HOME}/modules/scala-0.8/lib
Where are classes written by the compiler? /path/to/helloworld/eclipse/classes
な感じで質問に答えていくと設定ファイルの雛形(
/path/to/helloworld/.ensime
)ができます。クラスファイルの出力先は、Play!本来の挙動に影響を与えたくないので、
eclipse/classes
に向けてあります。この設定ファイルに外部ライブラリの位置などを追加設定します。
:sources
に、テストコード用のディレクトリ( "./test" )を追加します。:compile-jars
に、Play!の依存ライブラリがあるディレクトリを追加します。
すると、以下のようになります。
;; This config was generated using ensime-config-gen. Feel free to customize its contents manually.
(
:project-name "helloworld"
:project-package ""
:sources ("./app" "./test")
:compile-jars ("./lib" "${PLAY_HOME}/modules/scala-0.8/lib" "${PLAY_HOME}/framework" "${PLAY_HOME}/framework/lib")
:target "./eclipse/classes"
)
これで設定ができましたので、ENSIMEを起動します。
M-x ensime
Play!にモジュールを追加すると、依存ライブラリ、もしくはソースコードが付いてくるので、それらを順次追加していくことでENSIMEでの補完やエラー表示なども正しく表示されるようになります。
Maven2で依存ライブラリ取得
Maven2を使うと、依存ライブラリを自動的に(Mavenレポジトリにあれば)収集できて便利です。そこで、Mavenモジュールを使います。
conf/application.conf
ファイルにMavenモジュールを使うための設定を追加します。Scalaモジュールの設定があるあたり(27行目あたり?)です。
module.scala=${play.path}/modules/scala-0.8
module.maven=${play.path}/modules/maven-head
これでMavenモジュールのコマンドがPlay!に追加されました。
初期化
まずはMavenモジュールを初期化します。$ ${PLAY_HOME}/play mvn:init helloworld
プロジェクトに
pom.xml
ファイルが追加されます。pom.xml
ファイルの groupId
や artifactId
タグの設定は自プロジェクトに合わせて修正したほうがいいかもしれません。依存ライブラリの管理
dependencies
タグで依存ライブラリの設定を行った後、$ ${PLAY_HOME}/play mvn:update helloworld
// or play mvn:up
とすると依存ライブラリをダウンロードし、
lib
ディレクトリに保存してくれます。また、
$ ${PLAY_HOME}/play mvn:refresh helloworld // or play mvn:re
とするとlib以下を一旦削除してから再度依存ライブラリを格納しなおします。
依存ライブラリのバージョンを変更した場合などはこちらを使うことになります。
ソースコードをダウンロードする場合には
$ ${PLAY_HOME}/play mvn:source helloworld // or play mvn:src
とします。
(ソースコードはレポジトリにない場合がありますので、その場合にはダウンロード出来ません。)
新しくライブラリを追加した場合には、再度
eclipsify
することでEclipseにも認識させることができます。ENSIMEも再起動させれば認識します。
Maven2について
Maven2自体の使い方については、以前まとめましたので、そちらを参照してください。特に依存ライブラリの管理については依存解決とレポジトリのページにまとめてあります。
Maven2は本来ビルドツールなのですが、Play!で使う場合には依存ライブラリ管理でのみ使うことになりそうです。
(Maven2によるビルドも試みましたが、今のところうまくいっていません。)
共有ライブラリはMaven2プロジェクトとして構築して、Webアプリ層となるPlay!プロジェクトでそれらを取り込む、という使い方になるのかな。
注意
eclipsify
やensime-conf-gen
などで生成した設定ファイルは、バージョン管理に含めないほうがいいようです。環境依存の設定が含まれていたりすると他のチームメンバーに影響を与えてしまう場合があるからです。
チームメンバーが必ずしもEclipseやEmacsを使っているとも限らないし。
たいした手間ではないので、各コマンドを各自で行い、各自の環境に合わせた設定にするようにしましょう。
pom.xml
ファイルは環境依存しにくいので大丈夫です。というかこれは同じものを使うべき。