Sunday, July 15, 2012

sbt-0.11 で Scala/Java 開発環境構築

sbt, a build tool for Scala
https://github.com/harrah/xsbt

以下の2つのファイルが必要になります。

  • sbt-launch.jar
  • sbt-launch.jar を起動するシェルスクリプト = sbt コマンド

sbt-launch.jartypesafe のリポジトリ から取得します。

% curl -LO "http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.11.3-2/sbt-launch.jar"

同ディレクトリに、以下のシェルスクリプトで sbt-launch.jar を起動する sbt コマンドを作成します。

#!/bin/sh

java -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -jar `dirname $0`/sbt-launch.jar "$@"

32bit OS で JavaVM のメモリ制限にかかる場合は -Xmx (ヒープの最大サイズ) を下げます。

java -Xms512M -Xmx1024M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -jar `dirname $0`/sbt-launch.jar "$@"

作成した sbt コマンドにパスを通しておきます。以下の例では ~/.sbt/bin に設置しています。

% vi ~/.bash_profile
...
export PATH=~/.sbt/bin:${PATH}
...

% source ~/.bash_profile
% which sbt
~/.sbt/bin/sbt

以下の構成でファイル/ディレクトリをあらかじめ作成します

  • buid.sbt
  • project/build.properties
  • src/main/java/
  • src/main/scala/
  • src/main/resources/
  • src/test/java/
  • src/test/scala/
  • src/test/resources/
  • lib/

build.sbt にプロジェクトの情報を記載しておきます。

name := "sandbox"

version := "1.0"

scalaVersion := "2.9.1"

project/build.properties に sbt の情報を記載しておきます。

sbt.version=0.11.3

ソースは src/main/(java|scala) に置きます。src/main/scala/Sandbox.scala を作成してみます。

object Sandbox {
  def main(args:Array[String]) {
     println("Hello World")
  }
}

プロジェクトディレクトリ直下で sbt コマンドを実行するとインタラクティブモードでコンソールが立ち上がります。初回起動時は必要なパッケージがダウンロードされます。

% cd /path/to/sbt/project/sandbox
% sbt
...
[info] Done updating.
[info] Set current project to sandbox (in build file:...)
>

run でコンパイルが行われ main ブロックが実行されます。

> run
[info] Compiling 1 Scala source to ...
[info] Running Sandbox
[success] Total time: ....
Hello World

compile でコンパイルのみ行われます。先頭に ~ を付けるとファイル更新を検知して、自動でコンパイルしてくれます。

> ~compile
1. Waiting for source changes... (press enter to interrupt)

lib/

sbt で管理しない jar パッケージは、lib/ に置いておきます。自動で -classpath を通してくれます。

src/main/resources

データファイル関連は src/main/resources に置きます。

src/main/resources/sandbox.properties を読み込む src/main/scala/Sandbox.scala のサンプルコードです。

import java.io.FileInputStream
import java.util.Properties

import scala.collection.JavaConversions._

object Sandbox {
  def main(args:Array[String]) {

    val prop = new Properties()
    prop.load(getClass().getResourceAsStream("/sandbox.properties"))

    prop.stringPropertyNames().foreach { key =>
      println(prop.getProperty(key))
    }
  }
}