Spring Boot 1.XとSpring Boot 2.Xは、について同じオプションと動作を提供しませんExternalized Configuration
。
M. Deinumの非常に良い答えは、Spring Boot 1の仕様を参照しています。
ここでSpring Boot 2に更新します。
環境プロパティのソースと順序
Spring Boot 2は、PropertySource
値を適切に上書きできるように設計された非常に特殊な順序を使用します。プロパティは次の順序で考慮されます。
ホームディレクトリのDevtoolsグローバル設定プロパティ(devtoolsがアクティブな場合は〜/ .spring-boot-devtools.properties)。
@TestPropertySource
テストの注釈。
@SpringBootTest#properties
テストのアノテーション属性。コマンドライン引数。
[プロパティSPRING_APPLICATION_JSON
(環境変数またはシステムプロパティに埋め込まれたインラインJSON)。
ServletConfig
initパラメータ。
ServletContext
initパラメータ。
のJNDI属性java:comp/env
。
Javaシステムプロパティ(System.getProperties()
)。
OS環境変数。
RandomValuePropertySource
ランダムにのみプロパティを持つA。*。
パッケージ化されたjar(application-{profile}.properties
およびYAMLバリアント)外のプロファイル固有のアプリケーションプロパティ。
jar(application-{profile}.properties
およびYAMLバリアント)内にパッケージ化されたプロファイル固有のアプリケーションプロパティ。
パッケージ化されたjar(application.properties
およびYAMLバリアント)外のアプリケーションプロパティ。
jar(application.properties
およびYAMLバリアント)内にパッケージ化されたアプリケーションプロパティ。
@PropertySource
@Configuration
クラスの注釈。デフォルトのプロパティ(で設定
SpringApplication.setDefaultProperties
)。
外部プロパティファイルを指定するには、これらのオプションが必要です。
パッケージ化されたjar(application-{profile}.properties
およびYAMLバリアント)外のプロファイル固有のアプリケーションプロパティ。
パッケージ化されたjar(application.properties
およびYAMLバリアント)外のアプリケーションプロパティ。
@PropertySource
@Configuration
クラスの注釈。デフォルトのプロパティ(で設定
SpringApplication.setDefaultProperties
)。
これら3つのオプションのうち1つだけを使用するか、要件に応じてそれらを組み合わせることができます。
たとえば、プロファイル固有のプロパティのみを使用する非常に単純なケースでは十分ですが、他のケースでは、プロファイル固有のプロパティ、デフォルトプロパティ、および@PropertySource
。
application.propertiesファイルのデフォルトの場所
application.properties
ファイル(およびバリアント)については、デフォルトで、Springがファイルをロードし、以下の順序でこれらのプロパティを環境に追加します。
優先順位が高いほど、文字通りです
classpath:/,classpath:/config/,file:./,file:./config/
。
特定の名前を持つプロパティファイルの使用方法
デフォルトの場所では必ずしも十分でapplication.properties
はありません。デフォルトのファイル名()などのデフォルトの場所は適さない場合があります。さらに、OPの質問と同様に、application.properties
(およびバリアント)以外の複数の構成ファイルを指定する必要がある場合があります。
だからspring.config.name
十分ではありません。
この場合は、spring.config.location
環境プロパティ(ディレクトリの場所またはファイルパスのコンマ区切りのリスト)を使用して、明示的な場所を指定する必要があります。
ファイル名のパターンを自由にするために、ディレクトリのリストよりもファイルパスのリストを優先します。
たとえば、次のようにします。
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
この方法は、フォルダーを指定するだけで最も冗長ですが、構成ファイルを非常に細かく指定し、効果的に使用されるプロパティを明確に文書化する方法でもあります。
spring.config.locationがデフォルトの場所に追加するのではなく、置き換える
Spring Boot 1では、spring.config.location
引数はSpring環境の指定された場所を追加します。
ただし、Spring Boot 2以降でspring.config.location
は、ドキュメントで説明されているように、 Springで使用されるデフォルトの場所が、Spring環境の指定された場所に置き換えられます。
を使用してカスタム構成の場所を構成すると
spring.config.location
、デフォルトの場所が置き換えられます。たとえばspring.config.location
、に値classpath:/custom-config/
、が設定されている場合
、file:./custom-config/
検索順序は次のようになります。
file:./custom-config/
classpath:custom-config/
spring.config.location
現在は、すべてのapplication.properties
ファイルを明示的に指定する必要があることを確認する方法です。ファイル
をパッケージ化application.properties
することを想定していないuber JARの場合、これはかなり良い方法です。
spring.config.location
Spring Boot 2を使用している間の古い動作を維持するspring.config.additional-location
にはspring.config.location
、代わりに新しいプロパティを使用して、ドキュメントに記載されている場所を追加できます。
または、カスタム構成の場所がを使用して構成されて
spring.config.additional-location
いる場合、デフォルトの場所に加えて使用されます。
実際には
OPの質問のように、指定する2つの外部プロパティファイルと、uber jarに含まれる1つのプロパティファイルがあるとします。
指定した構成ファイルのみを使用するには:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
デフォルトの場所でこれらに構成ファイルを追加するには、次のようにします。
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties
最後の例では、デフォルトの場所にそれがあり、そのデフォルトの場所は上書きされず拡張されているため、必要ありません。
application.properties
いつも、ロードされspring.config.location
、ファイルがチェックされ、追加の設定場所を追加することができます(それはで終わるときには/
、あなたがそれらがロードされるファイルにあったポイントにカンマ区切りリストを置くしかし場合)。これは、こちらの