94
113

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-20

やりたいこと

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

以上です。

94
113
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
94
113

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?