🎈
SpringBootの設定ファイルを外部化したい時
環境
SpringBoot 1.3.5
jar でデプロイ (war の場合はこの記事の対象外)
どんな時に嬉しいか
開発中は、resources/application.yml を読んで欲しいが、本番時は運用者が設定ファイルを
変更する為に外だしのファイルになっていて欲しいという時。
何をするか
起動時のオプションを以下のように記述すれば OK
REM 適当に改行していますが、実際は一行で入力します
java
-jar
-Dspring.config.location="c:pathmyconfig.yml"
-Dspring.config.name="DummyConfigFilename" appname.jar
解説
spring.config.location は名前に反してファイル名まで入れる必要がある。
#StackOverflow で検索したらファイル名が入ってないパターンが多くてハマった。
spring.config.name にダミーのファイル名を指定しているのは、SpringBoot の設定ファイル
読込順として、クラスパスにある application.yml が優先して読みこまれるため。
これを指定しないと、クラスパス内の application.yml の指定を、外部ファイル
(上記例だと c:pathmyconfig.yml) で上書きするという感じになる。
#この動きが希望であれば、spring.config.name を指定する必要はない
#ただ、外部ファイル側で、キー名を間違えた場合にクラスパス内の指定が使用されるのは
#困るというか、原因究明しにくくなる・・・ような気がするので、spring.config.name に
#存在しないファイル名を指定して、クラスパス内の設定ファイルを読めないようにしている。
PS
logback の設定ファイルも外部化したのでそのことをあとで追記する。
Discussion