Playframework 2.1.0 をJavaで頑張った記録
試してみた上での結論。Javaで開発するのは修行僧。
2.1以降はScalaで組んだほうがいいです。というか、そういうつもりで開発していると思います。
Windows に Play 入れて動かす
参考)
http://www.atmarkit.co.jp/fjava/rensai4/play01/02.html
参考サイト見ながらではまらずできました。なので、以下はログみたいなもの。
Java7 と Play2.1.0 をDLしてインストール+展開。
$ java -version
で、パスが通ってなかったら、パスを通す。
$ javac
で、パスが通ってなかったら、 javac のいる場所にパスを通す。
$ cd C:\play-2.1.0\ $ play new firstProject
で、firstProject というプロジェクトを作って
$ cd firstProject $ play
したら、VMサイズ作れんと言われるので、
C:\play-2.1.0\framework\bulid.bat
のヒープサイズを小さくする。(メモリ4Gなのでとりあえず、-Xmx512Mで)
したら、再度 play して、run。
[firstProject]$ run
ブラウザで下記URLにアクセスして確認。 http://localhost:9000/
エラーがあったら、エラーが表示される。
コンパイルしてみる
参考) http://www.playframework.com/documentation/2.1.0/Production http://www.playframework.com/documentation/2.1.0/ProductionDist
日本語サイトもありますが、これをやっている時点で 2.1.0 の翻訳はなかったので本家サイトのほうで。 2.0系と地味に違うところもあるので、日本語サイトの通りやってみて動かなかったら本家を参考にするとよいです。
バックグランド起動するには、↓ってやる。 コンパイル済み過去ファイルを全部クリアして、ステージング環境作るよ!ってことらしい。
$ play clean compile stage
ステージ環境のコンパイル。 エラー吐きまくるけど、chmodに失敗してるだけっぽいからどうやら大丈夫っぽい。 生成された start ファイルはシェルなので、cygwin から起動したら動きます。 サイトでは、windowsだと駄目だよ!って書いてます。バッチファイル作ってくれない。
ちなみに、cygwinでは run は動きませんでした。scala 内でのPATHの取得で失敗してます。
デプロイは、
$ play -Dconfig.file=<本番用>/application.conf dist
上記コマンドで作ったZIPを解凍して、start 実行すればよいんじゃなかろうか。 それとも起動時にconf指定するほうがいいのか。 実務で使うのなら、warにしてJettyとかのが安心ですかね。
コンソールの文字化け
play 実行後のエラーメッセージが文字化けするのは、こちらの記事を参考に https://groups.google.com/forum/#!topic/play_ja/nWM60qRWqD0
set _JAVA_OPTIONS="-Dfile.encoding=SJIS"
の環境変数をjavac 実行前に追加してみたら直りました。
とりあえず play.bat の先頭に足して動かしてます。 実行されるたび、わーんわーん言われるけど気にしない。
JDBC つないでみる
参考) http://blog.livedoor.jp/kotaatsuyama/archives/51340114.html
Application.conf のdbのところをコメント戻して、driver, urlを書き換える。
db.default.driver=com.mysql.jdbc.Driver db.default.url="jdbc:mysql://<host>/<database_name>"
Bulid.scalaに追記。バージョンは最新 5.1.24 だったので、それで。
val appDependencies = Seq( // Add your project dependencies here, .... "mysql" % "mysql-connector-java" % "5.1.24" )
追記したので、ライブラリを再取得してもらいます。
[firstProject] update [firstProject] reload
update コマンドの後で、success って出たら成功です。
EBean で振り分けてみる
たとえば、master/slaveに分けるとして、リソースが複数の場合は、modelのパッケージは分けなきゃいけないと書いてあります。 結論からいうと別に一緒でも問題ないようです。Evolution使うときにちょっとおかしなことになったりしますが、SQLを自動生成させなければ大丈夫っぽいです。
Application.conf の
db.<resource_name>.driver
この項目で、<resourse_name>が違うのを2セット用意する。
ebean.<resourse_name>="<models_package>.*"
ここで、DBリソースに対してのパッケージを指定する。
階層は深いのは対応していないので、hoge. とかで用意します。 EbeanPlugin.java で、. 限定で見てます。ひどい。
batch起動
Javaでは簡単には無理でした。 DefaultApplication が、Application にキャストできないので、Application 拡張したクラス作らないと駄目のようです。
Scala だと Application のインスタンスを取れるので、動きました。
いったんコンパイルしてから実行になるけども
$ play dist
でできたファイルを展開して、
$ java -cp "./lib*" batch.PlayExcutor
ってしたら動きました。なんかこのやり方だと結局ライブラリ使いまわしにはできるけれど…的な感じ…。実際のところどうなんでしょう? StackOverflowでバッチできないのって質問に対して、Playでバッチする必要あるの?ってレスがついてたりしてましたけど。
ちなみに、Scalaだと、
Play.start(new DefaultApplication(new File("."), this.getClass().getClassLoader(), None, Mode.Dev))
で、フレームワーク直接起動できます。 本家のコードコピペしたのに動かなかった…。まさか () 足りないとか、ちょっとびっくり。