Profile は、Spring でよく使用される機能であり、異なる環境設定に基づいて異なる設定ファイルを読み込むことで、異なる設定ロジックを実現することができます。
Spring のプロファイル#
Spring Boot では、プロファイルは設定ファイルを使用して実現されます。異なる環境では、異なる設定ファイルを読み込むことができ、異なる設定ロジックを実現することができます。具体的には、Spring Boot は次の種類の設定ファイルをサポートしています:
application.properties
application.yml
application-{profile}.properties
application-{profile}.yml。
application.properties と application.yml は共通の設定ファイルであり、すべての環境で読み込まれます。一方、application-{profile}.properties と application-{profile}.yml は、異なるプロファイルに基づいて読み込まれる設定ファイルです。アプリケーションが起動するとき、Spring Boot は現在の環境変数に基づいてどの設定ファイルを読み込むかを決定します。たとえば、現在の環境変数が dev である場合、application-dev.properties または application-dev.yml ファイルが読み込まれます。
使用方法#
実際の開発では、プロファイルを使用して次のような機能を実現することができます:
- 異なる環境の区別、例えば開発環境、テスト環境、本番環境。
- 異なるデータベース接続情報の設定、例えば開発環境ではローカルの MySQL データベースを使用し、テスト環境ではリモートの MySQL データベースを使用し、本番環境では阿里云の RDS データベースを使用する。
- 異なるログレベルの設定、例えば開発環境では DEBUG レベルを使用し、テスト環境では INFO レベルを使用し、本番環境では WARN レベルを使用する。
設定ファイルを使用して切り替える#
プロジェクトの resources ディレクトリに、application-prod.properties、application-test.properties、application-dev.properties の 3 つの異なる設定ファイルを作成します。プロジェクトの設定ファイルで、現在のプロファイルを設定する必要があります。次の 2 つの方法があります:
- application.properties ファイルで設定する。
spring.profiles.active=dev
- 起動コマンドで設定する。
java -jar myproject.jar --spring.profiles.active=dev
Maven のプロファイル#
Maven のプロファイルの原理は、プロファイルのセットを定義し、異なるプロファイルで異なるプロパティ値のセットを定義することで、プロファイルの選択によって異なるプロパティセットを有効にすることです。
pom.xml ファイルに異なるプロファイルを追加します:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- default Spring profiles -->
<profiles.active>dev</profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<!-- default Spring profiles -->
<profiles.active>prod</profiles.active>
</properties>
</profile>
</profiles>
次に、次のように pom.xml を設定します。これにより、src/main/resources/${profiles.active} のフォルダ内の設定ファイルが使用されます。
<build>
<resources>
<!-- 共通のリソースファイル -->
<resource>
<directory>src/main/resources</directory>
</resource>
<!-- 異なる環境のリソースファイル -->
<resource>
<directory>src/main/resources/${profiles.active}</directory>
<!-- Filterは、maven-resources-pluginが提供する機能であり、環境変数、pomファイルで定義されたプロパティ、指定された外部設定ファイルで定義されたプロパティを、プロパティファイル(*.properties)内のプレースホルダ(${})で置換するためのものです。ただし、上記のmaven-resources-pluginでは、ワイルドカードを@@にカスタマイズしているため、src/main/resources/${profiles.active}のファイル内の@@でプレースホルダとして使用されるパラメータを置換します。 -->
<filtering>true</filtering>
<includes>
<include>/*.*</include>
</includes>
</resource>
</resources>
</build>
これで、IDEA でプロファイルを切り替えることができます。
この設定では、dev と prod の 2 つのプロファイルが追加されており、activeByDefault はデフォルトで選択されることを示しています。
- Maven の起動時に、-P オプションを使用して指定したプロファイルを指定します。例:mvn spring-boot -Pdev
- Maven のパッケージング時に、-P オプションを使用して指定したプロファイルを指定します。例:mvn package -Pdev -DskipTests
WAR パッケージをビルドする際には、リソースファイルの処理段階を経るため、maven-resources-plugin がリソースファイルを処理するために使用されます。pom.xml の build ノードで次のように設定します:
<plugins>
<plugin>
<!-- この記事のプロファイルとは関係ありませんが、一緒に記述しています -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- コンパイルプラグイン、ここではJDKのバージョンを設定するために使用されます。デフォルトのバージョンは非常に低いため、設定が必要です -->
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<testSource>${java.version}</testSource>
<testTarget>${java.version}</testTarget>
</configuration>
<version>${maven-compiler-plugin.version}</version>
</plugin>
<!-- リソースファイル処理プラグイン、必ず設定する必要があります -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven-resources-plugin.version}</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
</plugins>
拡張#
Maven のインストールパッケージの conf/setting.xml にもプロファイルがあります。
pom にも profiles 属性があることを知っていますが、settings.xml の profile と pom の profile の違いは、settings.xml の profile には activation、repositories、plugineReositories、properties の 4 つのサブ要素しかありません。通常、リポジトリ情報を設定するために使用されます。
<profiles>
<profile>
<!-- プロファイルの一意の識別子 -->
<id>prod</id>
<!-- プロファイルを自動的にトリガーする条件ロジック -->
<activation />
<!-- 拡張プロパティリスト -->
<properties />
<!-- リモートリポジトリリスト -->
<repositories />
<!-- プラグインリポジトリリスト -->
<pluginRepositories />
</profile>
</profiles>
<!-- 複数のプロファイルを設定できます。通常、グローバルな設定を行います -->
<activeProfiles>
<!--make the profile active all the time -->
<activeProfile>ang-thirdparty-nexus</activeProfile>
<activeProfile>ang-central-nexus</activeProfile>
<activeProfile>aliyun-nexus</activeProfile>
<activeProfile>zcg-nexus</activeProfile>
</activeProfiles>