設定をロードする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.conf
をsrc/main/resources/
にではなくresources/
に間違って配置していたことが分かった。とても拍子抜けして悲しかった。あっさりプログラムは走った。サンプルコードはよく読もう。