Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

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

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

読み込み優先順位の話

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config

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

  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形式が好きです。

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files

  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のファイルを用意するという使い方になります。

参考

NewGyu
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした