やりたいこと
一般的にSpring Bootのapplication.properties周りの構成は以下のような感じになっている。
この構成でSpring Boot起動時に環境毎にapplication.propertiesを切り替えてみる。なお、設定方法は複数あるためここでは4つ紹介する。
1. 起動引数にプロファイルを設定
起動引数へ設定する方法は以下の2種類が存在する。
1. Command line arguments(コマンドライン引数)
java -jar spring-boot-application-properties-sample-1.0.0.jar --spring.profiles.active=dev1
2. Java System properties (System.getProperties())
java -jar -Dspring.profiles.active=dev1 spring-boot-application-properties-sample-1.0.0.jar
ただし、
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
にもある通り、優先順位はCommand line arguments(コマンドライン引数)の方が高いため、以下のように両方設定した状態で起動すると、
$ java -jar -Dspring.profiles.active=dev1 spring-boot-application-properties-sample.jar --spring.profiles.active=dev2
Java System properties (System.getProperties())である-Dspring.profiles.active=dev1
ではなく、
Command line arguments(コマンドライン引数)である--spring.profiles.active=dev2
が採用(上書き)される点に注意が必要。
※Java System properties (System.getProperties())である-Dspring.profiles.activeは優先順位が低く多くの変数に上書きされるので注意が必要。
2. OSの環境変数でプロファイルの設定
Spring Bootでは起動時に環境変数「SPRING_PROFILES_ACTIVE」をロードして、プロファイルとして設定してくれる。そのため、あらかじめOSの環境変数に「SPRING_PROFILES_ACTIVE」を定義してけば、そこで定義したプロファイルが採用される。
Windowsの設定。
Linuxの設定。
export SPRING_PROFILES_ACTIVE=dev1
上記のように定義しておくと、Spring Boot起動時にdev1というプロファイルがロードされ、「application-dev1.properties」が採用される。以下は、その時のコンソール出力。一番下に「The following profiles are active: dev1」と出力されており、dev1がアクティブとなっていることがわかる。
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.3.0.RELEASE)
2017-08-20 20:27:41.807 INFO 7080 --- [ main] com.example.App : Starting App on N-PC with PID 7080 (C:\Development\sts-bundle\workspace\spring-boot-application-properties-sample\target\classes started by N in C:\Development\sts-bundle\workspace\spring-boot-application-properties-sample)
2017-08-20 20:27:41.807 INFO 7080 --- [ main] com.example.App : The following profiles are active: dev1
3. APサーバのJNDIでプロファイルの設定
Spring Bootで作成したアプリをWARにして、別のAPサーバにデプロイして動作させるケース等では、APサーバのJNDIを使うとプロファイルとして設定してくれる。以下はTomcatを利用した場合の設定例。
Tomcatのcontext.xmlに定義する
<?xml version="1.0" encoding="utf-8"?>
<Context>
<Environment
type="java.lang.String"
name="spring.profiles.active"
value="dev2"/>
</Context>
上記のように定義しておくと、Tomcat起動時にdev2というプロファイルがロードされ、「application-dev2.properties」が採用される。以下は、その時のコンソール出力。一番下に「The following profiles are active: dev2」と出力されており、dev2がアクティブとなっていることがわかる。
※Spring BootでWARを作成して別のTomcatにデプロイする方法は、Spring BootでWARを作成して別のTomcatにデプロイするを参照。
4. APサーバのstartup.bat(sh)に環境変数としてプロファイルの設定
Tomcatであれば、startup.bat(sh)やcatalina.bat(sh)等に、
set "SPRING_PROFILES_ACTIVE=dev2"
export SPRING_PROFILES_ACTIVE=dev2
のように環境変数「SPRING_PROFILES_ACTIVE」にプロファイルを指定することも可能。
この場合、context.xmlに、
<?xml version="1.0" encoding="utf-8"?>
<Context>
<Environment
type="java.lang.String"
name="spring.profiles.active"
value="dev3"/>
</Context>
と定義されている場合はそちら(context.xmlに定義されているdev3)のプロファイルが優先される。
参考
Spring BootでWARに含めるapplication.propertiesを環境ごとにビルド時に切り替える
以上です。