PlayFramework 小ネタまとめ

プラグインとかビルドの設定すぐ忘れちゃうので覚書。 無記載の場合バージョン2.4.xの話だけど、たぶんそんなに変わらない。

Eclipseプロジェクトを生成

build.sbtに次を追加

// Compile the project before generating Eclipse files, so that generated .scala or .class files for views and routes are present
EclipseKeys.preTasks := Seq(compile in Compile)
// Java project. Don't expect Scala IDE
EclipseKeys.createSrc := EclipseCreateSrc.ValueSet(EclipseCreateSrc.ManagedClasses, EclipseCreateSrc.ManagedResources)
// Use .class files instead of generated .scala files for views and routes
EclipseKeys.projectFlavor := EclipseProjectFlavor.Java

sbt eclipse with-source=trueで生成.

Eclipseでプロジェクトを開いたらビルドパスにtarget/scala-2.11/classes_managedを追加. (LibrariesにAdd Class Folder)

JUnitテストの並列実行を切る

機能テストとかで困る場合用。build.sbtに次を追加。

parallelExecution in Test := false
Jacocoでテストカバレッジをとる

https://github.com/sbt/jacoco4sbt

project/plugins.sbtに次を追加

addSbtPlugin("de.johoop" % "jacoco4sbt" % "2.2.0")

build.sbtに次を追加

// 念のため並列実行も切っておく
parallelExecution in jacoco.Config := false
jacoco.settings

jacoco:coverカバレッジ生成。出力はtarget/scala-2.11/jacoco

JPAを使う場合の注意

persistence.xmlは対象のエンティティクラスが同じJarに入ってないとだめらしい。 何も設定せずにsbt distするとconfディレクトリが配布パッケージにできて、プロジェクトのconfディレクトリの中身がコピーされるが、 ここにpersisitence.xmlを入れとくと上記問題に引っかかる。

そこで、build.sbtに次を追加してconfディレクトリを配布パッケージに作らない。(Jarにはちゃんと入るので動く。)

PlayKeys.externalizeResources := false

よく読んだから公式のDocumentation[2.4.x 日本語], [2.5.x 英語]にちゃんと書いてある。 気づかなくて小一時間ハマった。

PlayFrameworkにDIしてもらう

GuiceAbstractModuleを継承したクラスのFQCNapplication.confに書いておけばPlayFrameworkでDIしてくれる。 演算子の雰囲気からわかる通り、複数のモジュールを追加できる。

play.modules.enabled += "modules.HelloModule"

(2.5.x以降限定?) デフォルト(ルート)パッケージにクラス名Moduleでモジュールを作っておけば上記設定さえ書かなくても動く。

アノテーションのつけ方とかはGuiceそのものなので割愛。 nodchipさんの記事心地良すぎるDependency Injectionライブラリ Guiceが参考になる。 英語が苦にならない人はGuice Wiki見よう。

Javadocを生成してもらう

何も設定しないとsbt docでscaladocになる。build.sbtに次を追加。

sources in (Compile, doc) ~= (_ filter (_.getName endsWith ".java"))