Play framework 2.0 betaが出たようです11 – 設定ファイルを使用する

この記事は公開されてから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形式を使えば階層形式でわかりやすく記述できそうです。

参考サイトなど