sbtでつくったjarを公開して、Play!のウェブアプリケーションに依存関係を設定する

毎日まいにち、地味なビルド回りとかに異様に時間とられてますが楽しいです。

さて、題名通り、共通ユーティリティ的なjarをつくって、あっちこっちのPlay!アプリケーションで使い回したい、というときに。
まず最初の(はまり)ポイントは、「PlayのdependenciesはIvyのローカルリポジトリをみていないようだ」というところです。mavenの公開リポジトリしかみていないので、あきらめてsbtでどこかのmavenリポジトリにpublishして、Play! にリポジトリと依存jarの設定をします。

 sbtでのpublishですが、正当派の手順はhttp://code.google.com/p/simple-build-tool/wiki/Publishingに書いてあります。会社の社内リポジトリへ公開するには、CIサーバ上でmvn installするのが唯一の方法!なので、私はかなり変則的にこう設定しました。

  • CIサーバ上で、sbtビルド、公開
% sbt package 
% sbt make-pom
% mvn install:install-file  -Dfile=target/scala_2.8.1/some_2.8.1-1.0.jar -DpomFile=target/scala_2.8.1/some_2.8.1-1.0.pom
  • Play!のdependencies.ymlの設定
require:
    - play
    - play -> scala 0.9
    - com.example -> some_2.8.1 ]1.0,)


repositories:
    - localRepo:
        type: iBiblio
        root: http://ciserver/maven2/repository
        contains:
           - com.example -> *


これで、Play! webアプリケーション側でplay dependencies --syncと実行すればjarを引っ張ってきて依存関係の設定をしてくれます。

ただ、開発進行中のこの時期、ちょっとした問題が。バージョン番号が変わらないと、Play!は依存するjarの更新してくれないらしいのです。libにあるファイルを消してもだめで、レポジトリに登録した新しいものではなく、Ivyのキャッシュにある古いjarをlibに引っ張ってきます。当たり前といえば当たり前ですが。ということで、sbtのビルドごとに、バージョン番号を変えるようにします。

project/build/以下にあるProjectファイルに以下を追記します。

  override def version = BasicVersion(1,Some(System.currentTimeMillis().toInt),None,None)

もうちょっといい方法がある気がするけど。で、ビルドごとにバージョン番号が異なるので、ビルドが変わるとplay dependencies --syncでjarが更新されるようになります。

早くビルド、環境回りのことが落ち着きますように