Spring Bootのアプリケーションで環境ごとにプロファイルを切り替える方法

こんにちは!ぐち(@bloguchi)です。

ネットで検索するとapplication.propertiesの設定やjavaコマンドでの起動時に環境変数を設定する方法はたくさんあったのですが、僕がやりたかったのは、warファイルをサーバのTomcat配下にデプロイし、サーバ側で静的に定義した値でプロファイルを切り替えたかったのです。

それでは早速、その方法をご紹介します。

環境ごとの設定ファイルを準備する

Spring bootのプロジェクトはデフォルトではapplication.ymlが作られていると思いますが、これらをサーバ側で設定するプロファイル名をつけた形で複数用意します。

僕はデフォルトとは別に、staging(ステージング環境)とproduction(本番環境)のプロファイルを準備しました。

書式はSpring Bootのルールに従い、application-XXX.ymlとします。XXXの部分はプロファイル名です。

application.ymlの中身

application.ymlがデフォルトのプロファイルとなりますので、すべての設定値を記述します。そこから、application-XXX.ymlは環境ごとに差異のある設定値のみを記載していく感じです。

こちらがapplication.ymlです。

そして、こちらがapplication-production.ymlです。

ソースコードで設定値を取得する

YMLファイルに記述した値を取得するために、EnvironmetnクラスをDIします。Spring Bootでは@Autowiredを変数に記述すると該当するクラスからインスタンスを生成し変数に入れてくれる便利機能です。

public class HogeController {
  @Autowired
  private Environment eivironment;
  // 省略・・・
}

そして、設定値を取得したい場所で下記のように書きます。

String title = eivironment.getProperty("env.title");

env.titleがapplication.ymlに記述した属性を指定しています。ドットでつなぐのはapplication.ymlのインデント階層です。

サーバ側にプロファイル名を設定する

最後にめちゃくちゃ大事な工程です。

Spring Bootで作成したアプリをwarファイルにして、別のアプリケーションサーバにデプロイする場合は、この設定を行わないと、いくらやってもプロファイル名が反映されません。これまでの手順はいくらやっても意味がないということになります。

以下の設定例はTomcatの場合です。

Tomcatのcontext.xmlに以下の内容を追記します。<Context>タグはあると思うので、その配下に追記してください。

<?xml version="1.0" encoding="utf-8"?>
<Context>
    <Environment
        type="java.lang.String"
        name="spring.profiles.active"
        value="produciton"/>
</Context>

このようにしておくと、Tomcatの起動時にproductionというプロファイル名が設定され、applicaiton.ymlに続いて、application-production.ymlが読み込まれて、設定値が有効となります。

まとめ

最近では何でもネットで検索すれば解決することが多くなっていますが、中にはヒットする数が少ない情報もあります。そういった情報をアップデートし、公開することで少しでも多くの人の役に立てばいいですね。

では今回はこの辺で。