Webアプリケーションにおける環境別設定ファイルの動的切り替え

Webアプリケーションで開発・テスト・本番などの異なる環境に対応するため、実行時に自動的に適切な設定ファイルを読み込む仕組みを実装する方法について説明します。

環境識別子の設定

環境を識別するために、オペレーティングシステムの環境変数を使用します。例えば、APP_ENV という名前の環境変数に devprod といった値を設定します。

Linux/macOS の場合:

echo 'export APP_ENV=dev' >> ~/.bashrc
source ~/.bashrc

Windows (コマンドプロンプト) の場合:

setx APP_ENV dev

※ 変更後はアプリケーションサーバーを再起動する必要があります。

起動時および実行中の設定読み込み

アプリケーション起動時に環境に応じた設定を読み込み、必要に応じて実行中に再読み込みできるようにします。

web.xml による初期化サーブレットの登録:

<servlet>
    <servlet-name>ConfigLoader</servlet-name>
    <servlet-class>com.example.config.EnvConfigServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>ConfigLoader</servlet-name>
    <url-pattern>/admin/reload-config</url-pattern>
</servlet-mapping>

設定ファイルの構成例

各環境ごとに以下の形式でプロパティファイルを用意します:

service-url-conf.properties(デフォルト)

SVC_URL=http://localhost:8080/api

service-url-conf-dev.properties

SVC_URL=http://dev-api.example.com/v1

service-url-conf-prod.properties

SVC_URL=https://api.example.com/v1

設定読み込みユーティリティ

環境変数に基づいて適切な設定ファイルをロードし、静的フィールドに保持します。

package com.example.config;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import java.io.InputStream;
import java.util.Properties;

public class ConfigManager {
    private static final Logger logger = Logger.getLogger(ConfigManager.class);
    public static Properties serviceConfig = new Properties();

    public static String loadEnvironmentConfig(String env) {
        String status = "success";
        String suffix = StringUtils.isBlank(env) ? "" : "-" + env;

        try (InputStream is = ConfigManager.class
                .getResourceAsStream("/service-url-conf" + suffix + ".properties")) {
            if (is != null) {
                serviceConfig.clear();
                serviceConfig.load(is);
            } else {
                logger.warn("設定ファイルが見つかりません: service-url-conf" + suffix + ".properties");
                status = "fail";
            }
        } catch (Exception e) {
            logger.error("設定ファイルの読み込みに失敗しました", e);
            status = "fail";
        }
        return status;
    }
}

初期化および再読み込みサーブレット

package com.example.config;

import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class EnvConfigServlet extends HttpServlet {
    @Override
    public void init() throws ServletException {
        String env = System.getenv("APP_ENV");
        ConfigManager.loadEnvironmentConfig(env);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String env = System.getenv("APP_ENV");
        String result = ConfigManager.loadEnvironmentConfig(env);
        String message = "success".equals(result) ? "設定の再読み込みに成功しました" : "設定の再読み込みに失敗しました";

        resp.setContentType("text/html;charset=UTF-8");
        resp.getWriter().write("<html><body><h2>" + message + "</h2></body></html>");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        doPost(req, resp);
    }
}

アプリケーションコードでの利用

どこからでもグローバル設定にアクセス可能:

String apiUrl = ConfigManager.serviceConfig.getProperty("SVC_URL");

タグ: Java Servlet Configuration Management Environment Variables Web Application

7月8日 17:02 投稿