§Play 2.2 移行ガイド
これは Play 2.1 アプリケーションを Play 2.2 へ移行するためのガイドです。 Play 2.0 から移行する場合は、まず Play 2.1 移行ガイド に従ってください。
§ビルドタスク
§Play 組織とバージョンの更新
Play はこれまでと異なる organization id の元に公開されるようになりました。これにより、ようやく Play を Maven Central に配置することができます。古い organization id は play
で、新しい id は com.typesafe.play
です。
バージョンも 2.2.0 にアップデートする必要があります。
新しい organization id を使って project/plugins.sbt
中の Play プラグインを更新してください:
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.0")
さらに、もし何か Play の artifact に依存するものがあり、ヘルパーを使わずに依存している場合、それらの organization id とバージョン番号を更新する必要があるかもしれません。
§SBT バージョンの更新
sbt 0.13.0 を使うように project/build.properties
を更新する必要があります。
§root プロジェクトの更新
sbt のマルチプロジェクトビルドを使っていて、このプロジェクトの root ディレクトリを指定した project が存在しない場合、root プロジェクトはアルファベット順で決められる代わりに、rootProject で上書きして設定することができるようになりました:
override def rootProject = Some(myProject)
§Scala バージョンの更新
(例えば play.Project に加えて、Project を使うマルチプロジェクトビルドがある場合など) 複数の scalaVersion がある場合、2.10.2 に更新してください。
§Play キャッシュモジュール
Play キャッシュは独自モジュールに切り出されました。Play キャッシュを使っている場合は、依存性として追加する必要があります。例えば、次のように Build.scala
に追加します:
val addDependencies = Seq(
jdbc,
cache,
...
)
Play 2.2 以前のバージョンに依存するプラグインに依存している場合、複数のキャッシュ機能がロードされることになるため、衝突が発生することに注意してください。この問題が発生した場合は、プラグインを最新化するか、古いバージョンの Play が確実に除外されるようにしてください。
§Scala における新しい構造の Result
アクション合成とフィルターを簡素化するために、Play の Result 構造はシンプルになりました。以前は SimpleResult
, ChunkedResult
そして AsyncResult
に加えて Result
および PlainResult
インタフェースがありましたが、Result の型は SimpleResult
ただひとつになります。SimpleResult
を除いて、すべて非推奨になりました。SimpleResult
のサブクラスである Status
は、Result を組み立てるために便利であるため、まだ残っています。ほとんどの場合において、アクションは非推奨となった型をまだ使うことができますが、非推奨の警告が表示されるでしょう。合成またはフィルターを行うアクションはどうにかして SimpleResult
を使うように切り替える必要があります。
§非同期アクション
以前は次のように書く必要のあったところで:
def asyncAction = Action {
Async {
Future(someExpensiveComputation)
}
}
Action.async
ビルダを使えるようになります:
def asyncAction = Action.async {
Future(someExpensiveComputation)
}
§チャンクした Result を使う
これまで Status
クラスの stream
メソッドはチャンクされた Result を生成するために使われました。これは非推奨となり、Result がチャンクされることを明確にする chunked
メソッドで置き換えられます。例えば:
def cometAction = Action {
Ok.chunked(Enumerator("a", "b", "c") &> Comet(callback = "parent.cometMessage"))
}
直接 ChunkedResult
を作ったり使ったりする高度な使い方は、手動で TransferEncoding: chunked
ヘッダーを設定/チェックし、そして新しい Results.chunk
と Results.dechunk
enumeratee を使うコードで置き換えられるべきです。
§アクション合成
アクションを合成する際は、アクションを組み上げるために実装された ActionBuilder
を使うことをお勧めします。
やり方の詳細は ここ で読むことができます。
§フィルタ
EssentialAction
により生成される iteratee は、Result
の代わりに SimpleResult
を生成します。これは Result と動作する必要のあるフィルターは、もう AsyncResult
を PlainResult
にアンラップする必要がないことを意味し、間違いなくすべてのフィルターをシンプルに、そして簡単に書けるようにします。これまでアンラップを行っていたコードは、大抵の場合、map
を呼び出すひとつの iteratee で置き換えることができます。
§play.api.http.Writeable の適用
これまで SimpleResult
のコンストラクタは Enumerator
型に渡される Writeable
を受け取りました。これからは enumerator は Array[Byte]
でなければならず、Writeable
は便利な Status
メソッドのためだけに使われます。
§テスト
これまで Helpers.route()
や、その実体は常に AsyncResult
である Result
を返す同様のメソッド、そして status
, header
および contentAsString
などの Helpers
のメソッドは、引数に Result
を受け取りました。これからは Helpers.route()
から Future[SimpleResult]
が返されて、抽出メソッドに受け入れられます。一般的なユースケースとして、型を決定するために型インタフェースが使われている箇所については、テストコードを変更する必要はありません。
§Java における新しい構造の Result
アクションの合成をシンプルにするために、Java の Result 構造 は変更されました。AsyncResult
は非推奨になり、通常の Result を AsyncResult
型とはっきり区別するために SimpleResult
が導入されました。
§非同期アクション
これまで、非同期アクション内の future は async
呼び出しのなかにラップしなければなりませんでした。これからは、アクションは Result
または Promise<Result>
のいずれかを返します。例えば:
public static Promise<Result> myAsyncAction() {
Promise<Integer> promiseOfInt = play.libs.Akka.future(
new Callable<Integer>() {
public Integer call() {
return intensiveComputation();
}
}
);
return promiseOfInt.map(
new Function<Integer, Result>() {
public Result apply(Integer i) {
return ok("Got result: " + i);
}
}
);
}
§アクション合成
play.mvc.Action
にある call
メソッドのシグネチャは Promise<SimpleResult>
を返すように変更されました。Result に対してなにもしていない場合に必要となる変更は、通常は型のシグネチャを更新することだけです。
§コンテキストを実行する Iteratee
アプリケーションが提供するコードを実行する iteratee, enumeratee そして enumerator は、暗黙のコンテキストを要求するようになります。例えば:
import play.api.libs.concurrent.Execution.Implicits._
Iteratee.foreach[String] { msg =>
println(msg)
}
§F.Promise の並列実行
ユーザより提供されたコードを F.Promise
クラスが実行する方法は、Play 2.2 で変更されました。
Play 2.1 の F.Promise
は、ユーザーコードの実行に制限を加えていました。与えられた HTTP リクエストに対する Promise の操作は、登録された順番に、本質的にはシーケンシャルに実行されるものでした。
Play 2.2 において、この順序性の制限は取り除かれ、promise の操作は平行して実行できます。F.Promise
クラスによって実行される作業は、実行に一切の制限を加えること無しに Play のデフォルトスレッドプール を使うようになります。
一方、いまだに Play 2.1 の古めかしい振る舞いは、それを望むひとのために OrderedExecutionContext
クラスに保持されています。Play 2.1 の古めかしい振る舞いは、F.Promise
のあらゆるメソッド引数に OrderedExecutionContext
を渡すことで、簡単に再現することができます。
以下に示すのは、Play 2.2 で Play 2.1 の振る舞いを再現するコードです。この例は Play 2.1 と同様の設定を使うことに注意してください。64 個のアクターのプールは Play デフォルトの ActorSystem
内で実行されます。
import play.core.j.OrderedExecutionContext;
import play.libs.Akka;
import play.libs.F.*;
import scala.concurrent.ExecutionContext;
ExecutionContext orderedExecutionContext = new OrderedExecutionContext(Akka.system(), 64);
Promise<Double> pi = Promise.promise(new Function0<Double>() {
Double apply() {
return Math.PI;
}
}, orderedExecutionContext);
Promise<Double> mappedPi = pi.map(new Function<Double, Double>() {
Double apply(x Double) {
return 2 * x;
}
}, orderedExecutionContext);
§Jackson Json
Jackson のバージョンを 2 にアップグレードしました。これは、パッケージ名が org.codehaus.jackson
ではなく com.fasterxml.jackson.core
になることを意味します。
§配布物の準備
stage および dist タスクは Play 2.2 で Native Packager Plugin を使うように完全に書き換えられました。
今後、Play の成果物はプロジェクトの dist
フォルダには出力されません。その代わりに、プロジェクトの target
フォルダに作成されます。
その他に、Play アプリケーションを起動する Unix スクリプトの場所が変更されています。2.2 以前、この Unix スクリプトは start
という名前で配布物フォルダの最上位層に置かれていました。2.2 では、このスクリプトはプロジェクトごとの名前を持ち、配布物の bin
フォルダに置かれます。さらに、Windows 上で Play アプリケーションを起動することができる .bat
スクリプトもそこに置かれます。
start
スクリプトに渡していた引数のフォーマットが変更されていることに注意してください。start
スクリプトに-h
を渡して、受け付けられる引数を確認してください。
新しい stage
および dist
タスクのより詳しい情報については、ドキュメント "本番モードでアプリケーションを起動する" を参考にしてください。