Play2をサーブレットコンテナで動かす

Play2は組み込みのNetty上で動作します。サーブレットコンテナ上での動作はサポートされていません(ロードマップを見ると今後、バックエンドの1つとしてサポートされる可能性はあるようです)。
しかし、様々な事情でTomcatなどのサーブレットコンテナ上でPlay2を動かしたいというケースもあるでしょう。play2-war-pluginというsbtプラグイン(とランタイムを組み合わせたもの)を使用するとPlay2アプリケーションをwarにしてサーブレットコンテナ上で動作させることができます。

play2-war-pluginを使用するにはまずAPP_HOME/project/plugins.sbtに以下の記述を追加します。

resolvers += "Play2war plugins release" at "http://repository-play-war.forge.cloudbees.com/release/"

addSbtPlugin("com.github.play2war" % "play2-war-plugin" % "0.8")

続いてAPP_HOME/project/Build.scalaの先頭に以下の記述を追加します。

...
import PlayProject._
import com.github.play2war.plugin._

さらにAPP_HOME/project/Build.scalaを以下のように変更します。

val appVersion      = "1.0-SNAPSHOT"
...
val main = PlayProject(appName, appVersion, appDependencies, mainLang = JAVA).settings(
  // ... Your own settings here
  Play2WarKeys.servletVersion := "3.0"
  // Or Play2WarKeys.servletVersion := "2.5"
).settings(Play2WarPlugin.play2WarSettings: _*)

play2-war-pluginで作成したwarはPlay2アプリケーションをキックするサーブレットで動作するのですが、このサーブレットServlet 3.0の非同期版と通常のサーブレットを使用する同期版があり、Play2WarKeys.servletVersionでどちらを使用するかを指定します。3.0を指定すると非同期モード、2.5を指定すると同期モードになります。Servlet 3.0対応のコンテナでも2.5を指定することで同期モードで動作させることができます。個人的に試した限りでは非同期モードはやたら不安定なので同期モードを使用するほうがよいと思います。
ここまで設定した状態でコマンドラインから

> play war

と実行することでwarファイルを作成することができます。
なお、2.5モードでwarファイルを作成した場合、APP_HOMEwar/WEB-INF/web.xmlが自動的に生成されます。これはweb.xmlがすでに存在する場合は上書きされないので、play2-war-pluginが自動生成したweb.xmlに独自の設定を追記することもできます。3.0モードの場合はweb.xmlは生成されませんが、手動で作成しておくことでwarファイルに含めることができます。この他にもAPP_HOME/warディレクトリに任意のファイルを配置しておくことでwarファイルに含めることができます。
というわけでplay2-war-pluginを使用することでPlay2アプリケーションをサーブレットコンテナで動かすことができるようになるわけですが、3.0(非同期)モードは正直使い物にならないレベルですが、2.5(同期)モードでも動きの怪しい場合があり、プロダクションで使うのはちょっとチャレンジかもしれません。もしかしたらコンテナに依存する部分もあるのかもしれませんが(今はTomcat7で試しています)、play2-war-pluginのトップページにもステータスはまだBETAとなっていますし、もう少し様子を見たほうがよいかもしれません。