Lambdaカクテル

Common LISPが好きなWeb屋さんです 自宅サーバやフロントエンドもできます

Scala/Javaで簡単に設定ファイルを使える便利ライブラリ「Typesafe.Config」を使う

設定をロードするScalaの便利なライブラリの説明、そしてこれが動かず数ヶ月くらい悩んでいたのが全くアホみたいな原因に気付き解決したというメモ。

What

Typesafe ConfigとはTypesafe社が開発している設定の読み込み機構。ライブラリやアプリケーションに組込む事で設定ファイル周りの面倒を一手に引き受けさせることができる。AkkaやSpray、Play Frameworkとかに採用されている。

設定ファイルはこのような書式で、ヒューマンリーダブル。

simple-lib {
foo = "This value comes from simple-lib's reference.conf"
hello = "This value comes from simple-lib's reference.conf"
whatever = "This value comes from simple-lib's reference.conf"
}

How

まずライブラリをインポートする。build.sbtに追記:

resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"

libraryDependencies += "com.typesafe" % "config" % "1.2.1"

続いて設定ファイルをsrc/main/resources/reference.confもしくはsrc/main/resources/application.confに作成する。二者の違いは後程。

simple-lib {
foo = "This foo value comes from simple-lib's reference.conf"
hello = "This hello value comes from simple-lib's reference.conf"
whatever = "This whatever value comes from simple-lib's reference.conf"
}

実際に設定を利用するソースコードにてライブラリをimportする:

import com.typesafe.config._

object Application extends App {
  override def main(args: Array[String]) = {
    val config = ConfigFactory.load()
    val configFoo: String = config.getString("simple-lib.foo")
    // => "This foo value comes from simple-lib's reference.conf"
  }
}

これだけ。

Which: reference.conf or application.conf

まずreference.confは、ライブラリがそのレファレンスとして使用する設定を記録するのに使われる。つまり、後にそのライブラリが使用される際に上書きされることを前提とした設定である。

これに対してapplication.confは、実際のアプリケーションが用いる設定である。ここに記述した設定は、そのアプリケーションが依存するライブラリで使用されているreference.confの内容をオーバーライドする。

二者はそれぞれ異なる性質があるので分離されているが、設定を提供するという点では共通である。ただその設定が下位ライブラリの設定として使われるか既定値として使われるかの違いしかない。

Java-like: system.property

Typesafe Configは、JARを走らせたりするときの-D hogehoge.hugahuga=42といった記述も取り込む。したがって実行時にコマンドラインオプションでプロパティを弄ることができる。

Problem

僕は設定がどうしてもロードできなくて悩んでいたが、reference.confsrc/main/resources/にではなくresources/に間違って配置していたことが分かった。とても拍子抜けして悲しかった。あっさりプログラムは走った。サンプルコードはよく読もう。

References

typesafehub/config · GitHub