LoginSignup
269

More than 5 years have passed since last update.

Spring-Bootの設定プロパティと環境変数

Last updated at Posted at 2015-02-12

Spring-Boot便利ですね。Springここまで進化しとったんかという感じです。

システムを作るとどうしても「設定」と「プログラム」を分離する必要が出てきます。
Javaには標準的にpropertiesファイルというやつがあるのですが、「どこからそのファイルを探すの?」というのは自前で作りこまなくてはなりません。

今日はSpring-Bootのそのへんの便利さについてです。(はっきり言って自分メモ)

読み込み優先順位の話

ここに、こんな記述があります。この中から自分が興味あるのだけピックアップします。

  1. Command line arguments.
  2. JNDI attributes from java:comp/env.
  3. Java System properties (System.getProperties()).
  4. OS environment variables.
  5. A RandomValuePropertySource that only has properties in random.*.
  6. Application properties outside of your packaged jar (application.properties including 1. YAML and profile variants).
  7. Application properties packaged inside your jar (application.properties including YAML and profile variants).
  8. @PropertySource annotations on your @Configuration classes.
  9. Default properties (specified using SpringApplication.setDefaultProperties).

ちなみに上が最強で下に行くほど弱いです。

1.Command line args(コマンドライン引数)

指定の仕方は --(ハイフン2つ)をつけて、--myapp.ldap.port=10389的な指定の仕方になります。
ただし、gradle bootRunで起動するときは一工夫が必要です。(gradleに対する引数として受けられてしまう様子…)

build.gradle
bootRun {
    if (project.hasProperty('args')) {    // "args" というプロパティが渡されていたら
        args project.args.split('\\s+')   // 空白文字で split して、 run タスクの args オプションにセットする
    }
}
コマンドライン
$ ./gradlew bootRun -Pargs="--myapp.ldap.port=10389"

参考

4. OS environment variables(OSの環境変数)

$ export MYAPP_LDAP_PORT=10389

これは--myapp.ldap.port=10389と同じ設定になります。

大文字のスネークケース(_区切り)にすればいいということですね。

6,7 application.yml

properties形式は使いにくいのでYAML形式が好きです。

  1. A /config subdir of the current directory.
  2. The current directory
  3. A classpath /config package
  4. The classpath root

自分的には、

  1. src/main/resources/configの下にapplication.yml というファイルを入れておいてパッケージングする→これをデフォルト値とする
  2. 環境によって上書きしたいところは${配布先のディレクトリ}/config/application.ymlに書く

というのがいい感じです。

プロファイル

本番環境の設定はこうだけど、ステージング環境ではこう、という環境レベルによる設定の違いってありますよね?
その場合には、

application.yml
application-staging.yml
application-production.yml

という感じでファイルを用意します。そして起動パラメータ--spring.profiles.active=productionを指定するか、環境変数でSPRING_PROFILES_ACTIVE=productionを指定すると、

  1. application.ymlの値が適用される
  2. それを上書きする形で application-production.yml の値が適用されます。

つまり、無印のapplication.ymlに環境によらない共通設定を書いておき、プロファイル毎に違うものは-profile名.ymlのファイルを用意するという使い方になります。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
269