scala/sbtでjarにリソースファイルを同梱して利用する

Scalaで静的リソースをjarに同梱し、あるいはjarに同梱したリソースファイルを利用する方法です。

1. 同梱する方法

以下のようなsbtの標準的なディレクトリ構成の場合、src/main/resources以下に配置したファイルはjarファイルに同梱されます。

hogeproj/
  +- src/
  |   +- main/
  |   |   +- java/
  |   |   +- resources/
  |   |   +- scala/
  |   +- test/
  +- project/

...(略)

2. 同梱したリソースファイルを利用する

Javaの方法と同様で、以下のようにしてInputStreamを取得します。

val is = getClass.getClassLoader.getResourceAsStream("hogehoge.txt")

3. サンプル

プロジェクトの構造

hogeproj/
  +- src/
  |   +- main/
  |   |   +- resources/
  |   |       +- hogehoge.txt
  |   |   +- scala/
  |   |       +- Main.scala
  |   +- test/
  +- project/
  |
...(略)

hogehoge.txt

hoge
hoge
fuga

Main.scala

import java.io._

object Test {

  def using[A](br: BufferedReader)(body: Iterator[String] => A): A = {
    try {
      body(Iterator.continually(br.readLine).takeWhile(_ != null))
    } finally {
      br.close
    }
  }

  def main(args: Array[String]) {
    using(new BufferedReader(new InputStreamReader(
      getClass.getClassLoader.getResourceAsStream("hogehoge.txt")))) {
        lines => lines foreach println
      }
  }

}

実行結果

[info] Running Test 
hoge
hoge
fuga
[success] Total time: 0 s, completed 2016/04/13 15:32:39

参考