typesafe config
typesafe(今はlightbend)が作ったconfig読み込みライブラリ
前置き
- 自分自身がなんとなく使っていたものなので、整理しようと書きました
- Scalaで使ってます
なに?
- 依存ライブラリなしのjavaで書かれた設定系ライブラリ
- JSON(.json)で書いたり、HOCON(.conf)で書いた設定ファイルをアプリケーションに読み込める
使うには
build.sbtに書こう
libraryDependencies += "com.typesafe" % "config" % "1.3.1"
ConfigFactory.load
でconfigファイルを読み込む。
帰ってきたconfigオブジェクトから設定したキーから値を取得して使用できる
Configオブジェクトにはget~
のメソッドがあり、configファイルに書いたものを型を指定して読み込むことができる。読み込んだとき、メソッドと実際の値の型が違えばエラーになる
コードにすると↓になる
import com.typesafe.config.ConfigFactory
object ConfigSample {
def main(args: Array[String]): Unit = {
val config: Config = ConfigFactory.load()
config.get~("path") // 設定値を~型として使って読み取る
// String, Int, Enum, Boolean, etc...
val subconf: Config = config.getConfig("subconfig")
// 下のようなconfファイルがあったとき
// subconfにはsubconfigをルートにしたConfigオブジェクトが返される
// なので`subconf.getString("host")`では"sub_host"が返る
/*
* # application.conf
* host = "main_host"
* subconfig {
* host = "sub_host"
* }
*/
}
}
なにが読み込まれるの?
ファイルパスのconfigの内容
ConfigFactory.load("ファイル名") // ファイル名には拡張子を含めない
src/main/resources以下の application.conf
, application.json
, application.properties
, reference.conf
とシステムプロパティ
application.conf
> application.json
> application.properties
> reference.conf
で設定値は優先される
reference.confは一番後回しにして読み取られるので、ライブラリなんか作るときはにデフォルト値を書いておくといいらしい。
include
- confファイルなら
include "ファイル名"
で指定したファイルの設定もinclude
を書いたファイルに取り込める。 includeしてきた
ファイルとした
ファイルで同じキーの設定値があった場合した
側の設定値が優先される - includeするファイルはconfファイルでなくていい(json, propertiesでOK)
a = "a"
include "a"
b = "b"
val config = ConfigFactory.load()
config.getString("a") // a
config.getString("b") // b
置換
プロパティ名 = ${置換元プロパティ名}
application_host = "untarakantara.com"
application_url = "https://${application_host}"
ConfigFactory.load().getString("application_url") // `https://untarakantara.com`
環境変数から置換
プロパティ名 = ${?環境変数}
環境変数がなく、環境変数名と同じなプロパティ名を持った値がconfに設定されてたらそれが使われる
password = ${?PASS_WORD}