たぶん忘れるメモ

記憶力はないのです。

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))

で、フレームワーク直接起動できます。 本家のコードコピペしたのに動かなかった…。まさか () 足りないとか、ちょっとびっくり。