[Scala]Playframework 2.4[Java]

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Playframework 2.4がでてました

今年の5月に、Playframeworkの2.4 "Damiya"がリリースされました。 2.2以降、Playにはさわっていなかったのですが、2.4になってDI機能が追加される等、 けっこうかわった部分もあるみたいなんで、ひさびさに使ってみます。

なお、"Damiya"っていうのはPlayのコントリビュータのGithub上のaliasらしいです。 でもって、今後の2.4.x系リリースには全部名前がつくみたいです。

動作環境

今回使用した動作環境は以下のとおりです。
* OS : MacOS X 10.9.4 * Java : 1.8.0_11

Playのインストール&プロジェクト作成

まずはPlay2.4のインストールから始めます。 ここからzipをダウンロードしてパスを通すか、 Homebrewをつかってtypesafe-activatorをインストールします。

% brew install typesafe-activator

2.2以前はplay new〜で新規Playアプリをつくってましたが、2.3以降はactivatorコマンドを使います。 初回はいろいろダウンロードしたりするので、結構時間かかります。

% activator new play24

どのテンプレートでアプリをつくるかきかれるので、とりあえずplay-scalaでつくっときましょう。

・
・
Choose from these featured templates or enter a template name:
  1) minimal-akka-java-seed
  2) minimal-akka-scala-seed
  3) minimal-java
  4) minimal-scala
  5) play-java
  6) play-scala
(hit tab to see a list of all templates)
> 6

アプリができたらそこへ移動して、activator run(activatorでコンソール立ち上げて、そこでrunでもOK) で起動します。 ここも初回はすごく時間かかります。

% cd play24/
% activator run
Getting org.scala-sbt sbt 0.13.8 ... 
・
・

起動後、http://localhost:9000にアクセスできます。 いつものPlayデモページが表示されます。

ちなみに、アプリ起動時にjava.lang.NoClassDefFoundError: play/Play$・・・みたいなエラーで起動しない場合、 play-fork-run.sbtのプラグイン指定バージョンを下記のように変更します。

addSbtPlugin("com.typesafe.play" % "sbt-fork-run-plugin" % "2.4.0")

そして、build.sbtのfork設定を、falseに変更します。

fork in run := false

これはバグみたいなので、そのうち修正されると思います。

IDE設定

ついでにIDEつかってPlayプロジェクトを編集できるようにしておきましょう。 EclipseでもIntelliJ IDEAでもOKです。私の環境ではIntelliJ 14 CEを使いました。 IntelliJを起動したら、まずはプラグインを追加でインストールします。 Preferences→Plugins→Brows repositoriesと選択し。 sbt、Scala、Scala Imports Organizer のプラグインをインストールします。

プラグインをインストールしたら、 File→New→Project from existing sources...を選択。 import project external model で、SBTを選択します。

これでPlayアプリがIDEA上で編集できます。

ソースをみてみる

生成されたデモアプリのソースを少しみてみましょう。 まずはapp/controllersのApplication.scalaを見てみます。

class Application extends Controller {

  def index = Action {
    Ok(views.html.index("Your new application is ready."))
  }

}

以前Controllerはobjectで宣言されてましたが、classになってますね。 RouterのデフォルトがDependency Ingected RouterというRouterに変更(build.sbtで指定)されており、 2.4で追加されたDIの関連でclassにしなければいけないようです。(classじゃないと@Injectとか使えない) なお、2.3以前のControllerを使用したい場合、build.sbtのroutesGenerator部分を削除すれば使用可能になります。

あと、routesファイルのassetを指定する箇所もちょっとかわってます。

GET     /assets/*file               controllers.Assets.versioned(path="/public", file: Asset)

app/views/main.scala.htmlでcssやjsをリバースルートしている箇所も@routes.Assets.versioned〜のようにしています。

2.3からけっこう変更されてますね。

まとめ

今回はPlay2.4を使ってみました。2.2からひさびさに使いましたが、少しさわっただけでもいろいろかわった印象をうけます。 とりあえず2.4ではDI機能が大きな変更点としてあるので、次はそれを使ってみたいと思います。

参考サイトなど