目次

Version 15, last updated by Indrajit Raychaudhuri at Nov 28 04:17 UTC

Lift プロジェクトは SBT で管理できます。

最新リリース用のサンプル Lift SBT プロトタイプが用意されています。以下の手順に従う代わりに、このプロトタイプを GitHub からクローンするやり方もあります。

また、Scala 2.8.0 を使うバージョン 2.2 用の SBT プロトタイプも用意されています。

基本となるディレクトリ構造の作成

まずはじめに、Maven といずれかの Lift archetype を使って、プロジェクトのアウトラインを作成します。

mvn archetype:generate -U \
   -DarchetypeGroupId=net.liftweb \
   -DarchetypeArtifactId=lift-archetype-basic \
   -DarchetypeVersion=2.2-SNAPSHOT \
   -DarchetypeRepository=http://scala-tools.org/repo-snapshots \
   -DremoteRepositories=http://scala-tools.org/repo-snapshots \
   -DgroupId=your.group.id -DartifactId=projectName

Scala 2.8 プロジェクトでは、2.2-SNAPSHOT を使用して lift-archetype-basic は lift-archetype-basic_2.8.0 に変更し、あとで示す 2.2 jar の命名規則に従ってください。

SBT プロジェクトの初期化

projectName ディレクトリで sbt を実行し、プロジェクト名とバージョンを入力します。

$ sbt
Project does not exist, create new project? (y/N) : y
Name: Project Name
Organization: your.group.id
Version [1.0]:
Scala version [2.7.7]: 2.8.0
sbt version [0.7.4]:
...
[success] Successfully initialized directory structure.
[info] Building project Hello Lift 1.0 using sbt.DefaultProject
[info] No actions specified, interactive session started. Execute 'help' for more information.
>

プロジェクト設定のセットアップ

プロジェクトは project/build/ProjectNameProject.scala で定義されます。ディレクトリを作成し、次の内容でファイルを作成します。

import sbt._

class ProjectNameProject(info: ProjectInfo) extends DefaultWebProject(info)
{
  val snapshots = ScalaToolsSnapshots
  val lift = "net.liftweb" %% "lift-mapper" % "2.2-SNAPSHOT" % "compile"
  val jetty6 = "org.mortbay.jetty" % "jetty" % "6.1.25" % "test"
  val h2 = "com.h2database" % "h2" % "1.2.121" % "runtime"
  // alternately use derby
  // val derby = "org.apache.derby" % "derby" % "10.2.2.0" % "runtime"
  val servlet = "javax.servlet" % "servlet-api" % "2.5" % "provided"
  val junit = "junit" % "junit" % "3.8.1" % "test"    
}

注意:

H2 (または Derby) の行は、lift-archetype-blank archetype を使っている場合には不要です。依存関係の val の名前は不適切です[訳注:該当部分はすでに直っています。詳しいことは履歴表示で確認できます]。次のように Set を使うやり方もあります。

override def libraryDependencies = Set(
   "net.liftweb" % "lift-mapper" % "2.0-SNAPSHOT" % "compile",
   "org.mortbay.jetty" % "jetty" % "6.1.14" % "test"
)

Scala 2.8.0 と Lift 2.2-SNAPSHOT の依存関係を使う場合には、${artifact}_${scala.version}-2.1-SNAPSHOT.jar という命名規則に従ってください。

この場合、依存関係を宣言するときに '%' をもうひとつ追加する必要があります。たとえば、次の行

"net.liftweb" % "lift-mapper" % "2.0-SNAPSHOT" % "compile"

は、次のように記述する必要があります。

"net.liftweb" %% "lift-mapper" % "2.1-SNAPSHOT" % "compile"

ファイルを作成したら、sbt コンソールで reload コマンドを実行します。

詳細:

"net.liftweb" % "lift-mapper" % liftVersion % "compile->default" と記述すると、net/liftweb/lift-mapper/<liftVersion> で artifact を探します。

"net.liftweb" %% "lift-mapper" % liftVersion % "compile->default" と記述すると、net/liftweb/lift-mapper_<scalaVersion>/<liftVersion> で artifact を探します。

%% を使っているのはクロスビルドのためで、(lift-mapper_2.8.0 のように) ビルド対象の Scala のバージョンが artifact 名の中に含まれている依存プロジェクトの場合には、SBT が自動的にビルド対象の Scala のバージョンへの置き換えを行います。

依存関係の取得

sbt コンソールで update コマンドを実行し、プロジェクトファイルに記述された依存関係を取得します。

注意: SBT がすべての依存関係をダウンロードするまでに数分かかることがあります。いったんダウンロードすれば、次回からアップデートにはそれほど時間はかからなくなります。

Jetty でのテスト

作成した Web アプリケーションは、パッケージに含まれている Jetty サーバーで実行できます。具体的には、sbt コンソールで jetty-run コマンドを実行して Web アプリケーションを起動します。Web アプリケーションは、http://localhost:8080 で実行されています。ポートは override val jettyPort = 8081 などとすることで設定できます。Web アプリケーションを停止するには、jetty-stop コマンドを実行します。

classpath にある依存関係にアクセスできるコンソールが必要な場合には、console と入力します (コンソールは jetty の実行中も使用できます)。変更があったかどうか走査しながら SBT のコマンドを実行するには、該当するコマンドの前にプリフィックス ~ を付けて、~compile~test~test-only some.test.class~jetty、などのようにします。ただし、~jetty の場合にはリターンキーを押して jetty を再起動しないと、変更内容が反映されません。これを回避するには、次のように指定します。

override def jettyWebappPath  = webappPath

JRebel を使って実行する場合は、次のように指定すれば、不要なリデプロイを回避することができます。

override def scanDirectories = Nil 

package アクションを実行すると Web アプリケーションを実働サーバー上にデプロイするときに使用できる WAR ファイルが作成されます。

OutOfMemory エラーが頻繁に発生する場合は、sbt シェルスクリプトを次のように変更してみてください。

java -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -Xss2M -jar `dirname $0`/sbt-launch.jar "$@"

JVM オプションを上のように指定すれば、SBT の動作がスムーズになるはずです。

Maven から SBT へのコンバータ

Stack Overflow にいくつかシンプルなスクリプトがあるので参考にしてください。http://stackoverflow.com/questions/2972195/migrating-from-maven-to-sbt