Java
spring
spring-boot
springframework
spring-mvc

Spring Boot起動時に環境毎にapplication.propertiesを切り替える色々

やりたいこと

一般的にSpring Bootのapplication.properties周りの構成は以下のような感じになっている。

無題.png

この構成で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の設定。

1.png

Linuxの設定。

export SPRING_PROFILES_ACTIVE=dev1

上記のように定義しておくと、Spring Boot起動時にdev1というプロファイルがロードされ、「application-dev1.properties」が採用される。以下は、その時のコンソール出力。一番下に「The following profiles are active: dev1」と出力されており、dev1がアクティブとなっていることがわかる。

コンソール(抜粋).log
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: 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に定義する
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がアクティブとなっていることがわかる。

2.png

※Spring BootでWARを作成して別のTomcatにデプロイする方法は、Spring BootでWARを作成して別のTomcatにデプロイするを参照。

4. APサーバのstartup.bat(sh)に環境変数としてプロファイルの設定

Tomcatであれば、startup.bat(sh)やcatalina.bat(sh)等に、

startup.bat
set "SPRING_PROFILES_ACTIVE=dev2"
startup.sh
export SPRING_PROFILES_ACTIVE=dev2

のように環境変数「SPRING_PROFILES_ACTIVE」にプロファイルを指定することも可能。
この場合、context.xmlに、

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を環境ごとにビルド時に切り替える

以上です。