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

### やりたいこと

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

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/23101/99951d0c-0d28-29a6-9b69-9cec59eb196d.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](https://qiita-image-store.s3.amazonaws.com/0/23101/361c1857-f4a4-87bf-490d-2e8ec901b6e4.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](https://qiita-image-store.s3.amazonaws.com/0/23101/c6365d72-d027-dd61-2281-276c493b0e2b.png)

※Spring BootでWARを作成して別のTomcatにデプロイする方法は、[Spring BootでWARを作成して別のTomcatにデプロイする](http://qiita.com/NagaokaKenichi/items/3f191aeb6f161101d5f6)を参照。

### 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を環境ごとにビルド時に切り替える](http://qiita.com/NagaokaKenichi/items/b6c42547abbf3c0aecf5)

以上です。