javaとscalaのフレームワークplayについて。まずは、環境構築~アプリの雛形作成まで。

ここを参考 にして、playをダウンロード、インストール、play frameworkプロジェクト雛形、アプリの作成、、ブラウザでアプリの確認「http://localhost:9000/」まではうまくいった。runコマンドでバンドルされているwebサーバとサーブレットコンテナが起動できるみたいだ。ここまではコマンドラインで実行。環境はwindows7,64bit、jdk1.7、play2.1.1。けど、eclipseのプロジェクトへの変換で問題発生。どうやら、play2.0と2.1のバージョンの違いらしい。「play eclipsfy」じゃなくて「play eclipse」でやったらうまくいった。

c:\play\application\firstProject>play eclipsify
[info] Loading project definition from C:\tec\play\application\firstProject\project
[info] Set current project to firstProject (in build file:/C:/tec/play/application/firstProject/)
[error] Not a valid command: eclipsify (similar: eclipse)
[error] Expected '/'
[error] Expected ':'
[error] Not a valid key: eclipsify
[error] eclipsify
[error] ^

c:\play\application\firstProject>play eclipse
[info] Loading project definition from C:\tec\play\application\firstProject\project
[info] Set current project to firstProject (in build file:/C:/tec/play/application/firstProject/)
[info] About to create Eclipse project files for your project(s).
[info] Successfully created Eclipse project files for project(s):
[info] firstProject

とりあえず、コマンドプロンプトでプロジェクトがあるディレクトリに移動してplayコマンドでplayのプロンプトに入って、runコマンドを実行すれば、サーバが起動してアプリの実行はできる。

続いてeclipseからプロジェクトのインポートについて。プロジェクトエクスプローラ右クリック⇒インポート⇒一般の既存プロジェクトをワークスペースへを選択し、上記で出力したディレクトリc「:\play\application\firstProject」を指定する。これでエラーなしでプロジェクトをインポートできた。jarファイルが結構多い。
ちなみに既存プロジェクトとしてインポートするには、play eclipseコマンドでプロジェクトを変換(なにか必要なファイルを読み込んでいるだけだろう)する必要がある。

やっぱり早い・・・かな?コマンドプロンプトからコンテナを起動させた状態にしておいて、eclipseプロジェクト上のapp\contensts\controllers\Application.javaにある「 return ok(index.render("Your new application is ready"));」の文字列を変更して、ブラウザで確認してみたらすぐに反映された。java agile・・・

■アプリの変更が反映されない時
・とりあえずrunコマンドでコンテナを再起動してみる。
・それでもだめなら、play cleanコマンドでごみを消す。そうしたら解決されるかも。
・eclipseでcontrollerからreturnするものをテンプレートファイルに応じて作られるindexクラスにする場合、テンプレートを作った時点では作成されないクラスな訳でeclipse上ではコンパイルエラーが出る場合がある。このテンプレートに応じて作られるクラスは実行時もしくは「play compile」コマンドを実行した時点で生成される。
サンプルアプリのテンプレートをよんでみよう
・あと、ここ を参考にしてControllerのApplication.javaからretrunするクラスをParentのListに変更した時、画面表示でCompilation errorが表示された。エラー箇所はApplication,javaの「return ok(index.render(parents));」の部分。で、eclipseをよく見たら、views.html.indexがimportされていない。Ctrl+Shift+Fで自動でやってくれないみたいだから手動でやらないとだめだ。使ってるeclipseのバージョンが3.7だったから、4系なら改善されているかも。これで問題なく実行できるようになったけど、import views.html.indexとreturn文のところでコンパイルエラーが出ている。play cleanをやったりcompileしたりしたけど直らない。テンプレートのインポートエラー解消方法 にtarget/scala-2.9.1/class_managedディレクトリをクラスフォルダに追加すると書いてあるけど、そもそもtarget/scala-2.9.1ディレクトリはあるけどclass_managedディレクトリはないし、ビルドパスでクラスフォルダーを追加しようとしてもtargetディレクトリがない。この問題はプロジェクトエクスプローラのtargetディレクトリを右クリックしてビルドパス⇒ビルドパスの除去を選択してf5でリフレッシュしたら解決した。ちなみにimportエラーがなくなったら、ビルドパスの除去の選択肢は表示されなくなった。



・playコマンドラインで使えるコマンド一覧は「help play」[help]などで見れる。

・eclipseでplayのapiを見れるようにするには、プロジェクトのビルドバスの構成を選択してライブラリタブでplay2_10.jarのjavadocロケーションを選択して編集ボタンを押し、javadocロケーションパスで「http://www.playframework.com/documentation/api/2.1.1/java/」を指定する。もしくはプロジェクト内のplay2_10.jarを右クリックプロパティ⇒javadocロケーションで同上のurlを指定する。

■Controllerについて
・Controllerのroutsファイルのuriの指定の仕方について
routsファイル(@it)
HTTP Routing(公式play documentation2.1)
・Controllerクラスはstaticメソッドであることと戻り値にplay.mvc.Resultを返す事。戻り値にはok,badrequestなどがあり、それぞれhttpレスポンスのステータスコードに対応する。
Controllerクラス(@it)
ResultクラスAPI

■複数アプリ起動
・playのアプリを複数起動させたい場合、色々方法はあるだろうけど、手っ取り早いのはポートを別でアプリを起動する事。playのプロンプト上でrunコマンドを実行すれば、ポートが9000で起動する。もう一つ起動したい場合、ポートを指定して「run 9001」を実行する。

■eclipseでデバッグ
play debugでplayコンソールを起動し、runでサーバ起動する。eclipseでファイルを右クリックしてデバッグ⇒デバッグ構成でデバッグ構成を開き、リモートjavaアプリケーションのapplicationを選択し、接続タブで接続プロパティのホストとポートを指定してデバッグを押す。あとはブレークポイントをつけて、ブラウザから画面を表示すればデバッグパースペクティブで開く。

■あとで
・play runとplay startの違い。
playの実行runコマンドでstartコマンドの話
・playのリダイレクトフォーワード
公式(javaActions)

■mysql
デフォルトdbのh2ではなくmysqlを使用する。Application.confに以下の記述を書く。

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost/test_db"
db.default.user=user_name
db.default.password=password_value

localhostはホスト名、test_dbはdb名、user_nameはユーザ名、password_valueはパスワード。

mysqlのjdbc.jarをどこか適当なディレクトリに置き(libとか作ってもいい)、ビルドパスのライブラリでこのjarを追加する。mysqlライブラリがないと当然だけど、evolutionの起動時にconfiguration errorが出る。
エラー箇所は「db.default.driver=com.mysql.jdbc.Driver」。うまくいけばddlの画面が表示され、runボタンを押す。mysqlのtest_dbにテーブルが出来ていればOK。ちなみにplay_evolutionsテーブルが自動でてきていた。





■参考
Java開発で泣かないためのPlay frameworkの基礎知識
Play frameworkのDB操作を楽にするEBeanの基礎知識
play framework (公式英語、v2.1)
play ドキュメント(日本語、v2.0)
play 2.0.1 java API Reference
APIは雛形プロジェクトからも見れた。topページからjava,scala両方のAPIのリンクがはってある。javaのurlはhttp://localhost:9000/@documentation/api/java/index.html