この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
設定ファイルを読む
Play framework 2.0では、デフォルトの設定ファイルとしてconf/application.confファイルが使用されます。 applicaiton.conf以外に自分でファイルを追加することもできますし、それを別ファイルでincludeすることも可能です。 これらPlay frameworkで使用される設定ファイルは、Typesafe configライブラリに基づいており、 HOCONフォーマット(Human-Optimized Config Object Notation。JSONみたいなフォーマット)を使用して記述可能です。 では試してみましょう。
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.2
- Playframework : HEAD
- Java : 1.6.0_26
- Eclipse : 3.7
注意: この記事ではgithubから取得したHEAD版を使用して試しています。 正式リリース前の状況のため思わぬ不具合が生じるかもしれませんので、ご了承ください。
ソースのHEADを取得してセットアップ
まだgithubからソースを取得していない人は、play2.0のソースを取得してビルドしましょう。
$ git clone https://github.com/playframework/Play20.git
$ cd Play20/framework
$ ./build
> complile
> build-repository
> publish-local
すでにソースを取得している人は、最新の状態に更新してビルドします。
$ git pull
$ cd Play20/framework
$ ./cleanEverything
$ ./build
> compile
> build-repository
> publish-local
これで準備ができました。
プロジェクト作成
Scalaベースのプロジェクトを作成し、sbtコンソールを起動します。
% play new myConfig
% cd myConfig
% play
eclipsifyを実行してeclipseプロジェクト化してインポートしてソースの修正をしましょう。
>[myConfig] $ eclipsify
application.confにアクセス
まずはControllerからconf/application.confにアクセスします。 application.confに適当なkey-valueを追加し、Application.scalaで取得してみましょう。
#applicatin.confの一番下
test.msg="hello"
test {
hoconMsg:"hocon msg"
}
//Application.scala#index内
val appConf = Configuration.load()
println("appllication.conf/test.msg=" + appConf.getString("test.msg"))
println("appllication.conf/hocon.msg=" + appConf.getString("hocon.msg"))
println("nothing key=" + appConf.getString("xxx.yyy"))
test.msgはいままで通り=でキーと値を設定しています。 次の値は、JSONのような形式で{}で区切っています。 =でもHOCON形式でもアクセス方法の違いはありません。 次にAppliaiton.scalaを見てみましょう。Configuration.load()メソッドを使用すると、applicatio.confのオブジェクトが取得できます。 キーを.区切りで指定し、値を取得します。なお、戻り値はOptionになっているので、キーが存在しなければOption[None]が返ります。
独自定義の設定ファイルにアクセス
次に独自定義の設定ファイルを作成して、値を取得してみます。 confディレクトリにtest.confを作成して、Application.scalaに追記してください。
#test.conf
myconf.msg=this is myconf
myconf.foo {
bar: this is bar
baz: this is baz
}
//Application.scala#indexに追記
def getOriginConf(fileName:String) = {
ConfigFactory.load(ConfigFactory.parseFileAnySyntax(new File(fileName)))
}
val myConf = Configuration(getOriginConf("conf/test.conf"))
println("test.conf/myconf.msg=" + myConf.getString("myconf.msg"))
println("test.conf/myconf.foo.bar=" + myConf.getString("myconf.foo.bar"))
println("test.conf/myconf.foo.baz=" + myConf.getString("myconf.foo.baz"))
test.confを新たに作成し、ConfigFactoryを使用してロードしています。 設定ファイルの構文エラーがあれば、parseFileAnySyntaxの時点でエラーが発生します。
ファイルをインクルード
最後にファイルのインクルードをやってみます。
#application.confの一番下
test.inc {
incMyConf: {include "test.conf"}
}
//Application.scala#indexに追記
println("application.conf include=" + appConf.getString("test.inc.incMyConf.myconf.foo.bar")
application.confではキー: {include "インクルードするファイル名"}として、インクルードしています。 これによってapplication.confの内容は下記のように解釈されます。
test.inc {
incMyConf: {
myconf.foo {
bar: this is bar
baz: this is baz
}
}
}
まとめ
今回は設定ファイルの使いかたについてご紹介しました。HOCON形式を使えば階層形式でわかりやすく記述できそうです。
参考サイトなど
- Configuration file syntax and feature https://github.com/playframework/Play20/wiki/Configuration