Play 2.x で開発していたアプリケーションをステージング環境で play run
したり、プロダクション環境で稼動させるために play dist
したときに、以下のように、sbt.ResolveException の例外が発生した旨のログ出力がされて異常終了してしまったときの対処法をメモっておきます。
[warn] some of the dependencies were not recompiled properly, so classloader is not avaialable
[info] Updating {file:/path/to/play-app/}play-app...
[warn] [NOT FOUND ] org.slf4j#slf4j-api;1.6.6!slf4j-api.jar (1ms)
[warn] ==== local: tried
[warn] /opt/playframework/repository/local/org.slf4j/slf4j-api/1.6.6/jars/slf4j-api.jar
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: FAILED DOWNLOADS ::
[warn] :: ^ see resolution messages for details ^ ::
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: org.slf4j#slf4j-api;1.6.6!slf4j-api.jar
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
sbt.ResolveException: download failed: org.slf4j#slf4j-api;1.6.6!slf4j-api.jar
at sbt.IvyActions$.sbt$IvyActions$$resolve(IvyActions.scala:214)
(略)
at java.lang.Thread.run(Thread.java:724)
[error] (*:update) sbt.ResolveException: download failed: org.slf4j#slf4j-api;1.6.6!slf4j-api.jar
原因
Play プロジェクトを構築した時の Play framework のバージョンと、play run
などをしようとしたときのバージョンが異なる場合にこの例外が発生するようです。
より具体的には、Play プロジェクトが利用する sbt-plugin のバージョンは、実行環境の Play のバージョンと合わせる必要がある、ということです。
実は play run
を実行したときに、実行直後のログに赤文字で
This project uses Play 2.1.1!
Update the Play sbt-plugin version to 2.1.2 (usually in project/plugins.sbt)
と出力されていたりします。どうしても例外ログの方に真っ先に目が行ってしまいがちですが、ちゃんと Play framework は警告してくれています。
対処法
project/plugins.sbt
に記載されている sbt-plugin のバージョンを、実行環境の Play のバージョンと合わせましょう。例えば、Play プロジェクトを作成したときの Play のバージョンが 2.1.1 であれば、
addSbtPlugin("play" % "sbt-plugin" % "2.1.1")
となっているかと思いますが、これを、Play 2.1.2 の環境で稼動させようとするなら
addSbtPlugin("play" % "sbt-plugin" % "2.1.2")
としましょう。