Springプロファイルを使う
Spring Bootアプリケーションの動作を環境によって切り替えたいことがあります。
例えば小規模なアプリケーションであっても、最低限

  • データベース接続先
  • ログ出力先
の二つは切り替えることが多いと思います。また環境というのは、
  • ローカルPC上のSTSで開発し、STS上で動作確認やデバッグをしているとき
  • 開発環境(VM)に配備するとき
  • 本番環境(VM)に配備するとき
  • Dockerコンテナイメージにして動かすとき
などがあると思います。 ここでは、次のように「3つの環境×2つの設定ファイル」を切り替える例で説明します。

PC上で動かすとき

  • application-local.properties
  • logback-spring-local.properties

サーバ上で起動可能Jar(Tomcat内蔵Jar)として動かすとき

  • application.properties
  • logback-spring.properties

Dockerコンテナイメージで動かすとき

  • application-container.properties
  • logback-spring-container.properties

なお後述の手順の通り、2つのファイルで「local」とか「container」 の部分はそろえる必要は全くありません。ただ分かりやすさ優先です。

[1] 設定ファイルの作成
application-local.properties

spring.datasource.url=jdbc:***(ローカルPCから接続するDBのURL)
logging.config=classpath:logback-spring-local.xml
(他は略)

logback-spring-local.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
(他は略)
    <appender name="APPLICATION_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>C:/temp/testapp01.log</file>
        <encoder>
            <pattern>%d{yyyy/MM/dd HH:mm:ss} [%thread] %-5level %-50logger{40} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>C:/temp/testapp01-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>1MB</maxFileSize>
            <maxHistory>10</maxHistory>
            <totalSizeCap>10MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
    </appender>

</configuration>

application.properties

spring.datasource.url=jdbc:***(サーバーから接続するDBのURL)
logging.config=classpath:logback-spring.xml
(他は略)

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
(他は略)
    <appender name="APPLICATION_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${user.home}/app/log/testapp01.log</file>
        <encoder>
            <pattern>%d{yyyy/MM/dd HH:mm:ss} [%thread] %-5level %-50logger{40} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${user.home}/app/log/testapp01-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>1MB</maxFileSize>
            <maxHistory>10</maxHistory>
            <totalSizeCap>10MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
    </appender>

</configuration>

application-container.properties

spring.datasource.url=jdbc:***(コンテナから接続するDBのURL)
logging.config=classpath:logback-spring-container.xml
(他は略)

logback-spring-container.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
(他は略)
    <appender name="APPLICATION_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/opt/app/log/testapp01.log</file>
        <encoder>
            <pattern>%d{yyyy/MM/dd HH:mm:ss} [%thread] %-5level %-50logger{40} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>/opt/app/log/testapp01-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>1MB</maxFileSize>
            <maxHistory>10</maxHistory>
            <totalSizeCap>10MB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
    </appender>

</configuration>

[2] STSローカル実行の設定
STSの実行アイコン>の右側の▼を押す⇒Run Configurations...で 「Spring Boot App - {アプリケーション名(プロジェクト名)}」を選択し、VM Arguments欄に以下を入力します。

-Dspring.profiles.active=local

これでSpring Boot Applicationを起動すると「local」プロファイルが有効になるため、 自動的に設定ファイルとして application-local.properties が読み込まれ、 その中に記述している logback-spring-local.xml が読み込まれます。

[3] サーバー配備用Jarのビルドと実行
Maven Buildは普通にやればOKです。targetディレクトリに作られるjarファイルを SFTPツールなどでサーバーにアップロードします。

java /the/path/of/testapp-0.0.1-SNAPSHOT.jar

オプションを何もつけなければ、デフォルトの設定ファイル application.propertiesが読み込まれ、 その中に記述している logback-spring.xml が読み込まれます。

[4] Dockerコンテナイメージの作成
サーバー用のJarと同じものをコンテナ作成環境(PCなのかサーバーと同じ実機なのか)に持ってきて、 同じディレクトリにDockerfileを次のように作成します。

FROM eclipse-temurin:21
ENV INSTBASE=/opt/app
RUN mkdir ${INSTBASE} ${INSTBASE}/app ${INSTBASE}/database ${INSTBASE}/log
COPY ./testapp01-0.0.1-SNAPSHOT.jar ${INSTBASE}/app/.
EXPOSE 8090
CMD ["java", "-jar", "/opt/app/testapp01-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=container"]

で、

podman build -t testapp01 .
podman run -it -p 8090:8090 --rm testapp01

で起動すると、CMDの末尾の部分のオプションによって containerプロファイルが有効になるため、 自動的に設定ファイルとして application-container.propertiesが読み込まれ、 その中に記述している logback-spring-container.xml が読み込まれます。

Java kowaza Top

(first uploaded 2024/08/12 last updated 2024/08/12, URANO398)