設定ファイルの優先順位
Spring Bootプロジェクトでは、アプリケーションの設定を管理するために複数の形式の設定ファイルをサポートしています。主に以下の3種類が使用されます。
application.propertiesapplication.ymlapplication.yaml
これらは同じ目的を持ちますが、同一プロジェクト内で複数存在する場合、どのファイルの設定が最終的に有効になるかという「優先順位」が重要になります。
例えば、以下のように各ファイルでTomcatのポート番号を異なる値で定義したとします。
# application.properties
server.port=8081
# application.yml
server:
port: 8082
# application.yaml
server:
port: 8083
この状態でアプリケーションを起動すると、実際に使用されるのは application.properties の値(8081)です。つまり、ファイル形式ごとの優先順位は次の通りです(高いものから順):
application.propertiesapplication.ymlapplication.yaml
ただし、実際の開発現場では可読性や構造の明確さから、.yml 形式が主流として採用されることが多いです。一貫性を保つため、プロジェクト内では単一の形式を使用することが推奨されます。
その他の設定方法と優先順位の拡張
Spring Bootは柔軟な設定機構を持っており、ファイルだけでなく、外部からの設定もサポートしています。代表的な方法は以下の2つです。
- Javaシステムプロパティ:
-Dkey=value形式でJVM起動時に指定 - コマンドライン引数:
--key=value形式でアプリケーション実行時に渡す
例として、IDEA上でアプリを実行する際、以下のように設定を追加できます。
-Dserver.port=9000 --server.port=10010
これらの設定も含めた全体の優先順位は、次のように定義されています(低い順 → 高い順):
application.yamlapplication.ymlapplication.properties- Javaシステムプロパティ(
-Dserver.port) - コマンドライン引数(
--server.port)
したがって、上記の例では最終的にポート 10010 が使用されます。これは最も優先度が高い設定であるためです。
本番環境での設定適用
ビルド済みのJARファイルをサーバー上で実行する場合でも、同様に外部設定を適用可能です。Mavenで生成したJARに対して、以下のように実行します。
java -Dserver.port=9000 -jar myapp.jar --server.port=10010
このとき、アプリケーションはコマンドライン引数の --server.port=10010 を読み取り、ポート10010で起動します。
なお、JARの正常な実行には、ビルド時に spring-boot-maven-plugin がPOMに含まれている必要があります。Spring Initializrなどで生成されたプロジェクトでは、デフォルトでこの設定が含まれています。
まとめ:5つの設定ソースとその優先順位
Spring Bootでは、合計5種類の設定ソースをサポートしており、それぞれに明確なマージルールと優先順位があります。開発・運用においては、環境ごとに適切な設定方法を選択することで、柔軟かつ安全な構成管理が可能になります。