Spring Boot 1.X und Spring Boot 2.X bieten nicht die gleichen Optionen und Verhaltensweisen für das Externalized Configuration
.
Die sehr gute Antwort von M. Deinum bezieht sich auf die Besonderheiten von Spring Boot 1.
Ich werde hier für Spring Boot 2 aktualisieren.
Quellen und Reihenfolge der Umgebungseigenschaften
Spring Boot 2 verwendet eine ganz bestimmte PropertySource
Reihenfolge, die ein sinnvolles Überschreiben von Werten ermöglicht. Eigenschaften werden in der folgenden Reihenfolge berücksichtigt:
Eigenschaften der globalen Einstellungen von Devtools in Ihrem Home-Verzeichnis (~ / .spring-boot-devtools.properties, wenn devtools aktiv ist).
@TestPropertySource
Anmerkungen zu Ihren Tests.
@SpringBootTest#properties
Anmerkungsattribut für Ihre Tests. Kommandozeilenargumente.
Eigenschaften von SPRING_APPLICATION_JSON
(Inline-JSON, eingebettet in eine Umgebungsvariable oder Systemeigenschaft).
ServletConfig
Init-Parameter.
ServletContext
Init-Parameter.
JNDI-Attribute von java:comp/env
.
Java-Systemeigenschaften ( System.getProperties()
).
Betriebssystemumgebungsvariablen.
A RandomValuePropertySource
, das Eigenschaften nur zufällig hat. *.
Profilspezifische Anwendungseigenschaften außerhalb Ihres verpackten Glases ( application-{profile}.properties
und YAML-Varianten).
Profilspezifische Anwendungseigenschaften, die in Ihrem Glas enthalten sind ( application-{profile}.properties
und YAML-Varianten).
Anwendungseigenschaften außerhalb Ihres verpackten Glases ( application.properties
und YAML-Varianten).
Anwendungseigenschaften in Ihrem Glas ( application.properties
und YAML-Varianten).
@PropertySource
Anmerkungen zu Ihren @Configuration
Klassen. Standardeigenschaften (durch Einstellung festgelegt
SpringApplication.setDefaultProperties
).
Um externe Eigenschaftendateien anzugeben, sollten Sie folgende Optionen interessieren:
Profilspezifische Anwendungseigenschaften außerhalb Ihres verpackten Glases ( application-{profile}.properties
und YAML-Varianten).
Anwendungseigenschaften außerhalb Ihres verpackten Glases ( application.properties
und YAML-Varianten).
@PropertySource
Anmerkungen zu Ihren @Configuration
Klassen. Standardeigenschaften (durch Einstellung festgelegt
SpringApplication.setDefaultProperties
).
Sie können nur eine dieser 3 Optionen verwenden oder sie gemäß Ihren Anforderungen kombinieren.
In sehr einfachen Fällen reicht es beispielsweise aus, nur profilspezifische Eigenschaften zu verwenden. In anderen Fällen möchten Sie möglicherweise sowohl profilspezifische Eigenschaften als auch Standardeigenschaften und verwenden@PropertySource
.
Standardspeicherorte für application.properties-Dateien
Bei application.properties
Dateien (und Varianten) lädt Spring sie standardmäßig in der folgenden Reihenfolge und fügt ihre Eigenschaften in der Umgebung hinzu:
Die höheren Prioritäten sind so wörtlich :
classpath:/,classpath:/config/,file:./,file:./config/
.
Wie verwende ich Eigenschaftendateien mit bestimmten Namen?
Die Standardspeicherorte reichen nicht immer aus: Die Standardspeicherorte wie der Standarddateiname ( application.properties
) passen möglicherweise nicht. Außerdem müssen Sie wie in der OP-Frage möglicherweise mehrere andere Konfigurationsdateien als application.properties
(und die Variante) angeben .
Also spring.config.name
wird nicht genug sein.
In diesem Fall sollten Sie mithilfe der spring.config.location
Umgebungseigenschaft (eine durch Kommas getrennte Liste von Verzeichnispositionen oder Dateipfaden) einen expliziten Speicherort angeben.
Um frei über das Dateinamenmuster zu sein, bevorzugen Sie die Liste der Dateipfade gegenüber der Liste der Verzeichnisse.
Zum Beispiel so:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
Auf diese Weise ist es am ausführlichsten, nur den Ordner anzugeben, aber es ist auch die Möglichkeit, unsere Konfigurationsdateien sehr genau anzugeben und die effektiv verwendeten Eigenschaften klar zu dokumentieren.
spring.config.location ersetzt jetzt Standardspeicherorte, anstatt sie hinzuzufügen
Bei Spring Boot 1 spring.config.location
fügt das Argument bestimmte Speicherorte in der Spring-Umgebung hinzu.
Ab Spring Boot 2 werden jedoch spring.config.location
die von Spring verwendeten Standardspeicherorte durch die angegebenen Speicherorte in der Spring-Umgebung ersetzt, wie in der Dokumentation angegeben .
Wenn benutzerdefinierte Konfigurationsspeicherorte mithilfe von konfiguriert werden
spring.config.location
, ersetzen sie die Standardspeicherorte. Wenn beispielsweise spring.config.location
mit dem Wert konfiguriert
ist classpath:/custom-config/
, file:./custom-config/
wird die Suchreihenfolge der folgenden:
file:./custom-config/
classpath:custom-config/
spring.config.location
Auf diese Weise können Sie jetzt sicherstellen, dass eine application.properties
Datei explizit angegeben werden muss.
Für über JARs, die keine application.properties
Dateien verpacken sollen, ist das ziemlich nett.
Um das alte Verhalten bei der spring.config.location
Verwendung von Spring Boot 2 beizubehalten, können Sie die neue spring.config.additional-location
Eigenschaft verwenden. Stattdessen werden spring.config.location
weiterhin die in der Dokumentation angegebenen Speicherorte hinzugefügt :
Wenn benutzerdefinierte Konfigurationsspeicherorte mithilfe von konfiguriert werden spring.config.additional-location
, werden sie alternativ
zusätzlich zu den Standardspeicherorten verwendet.
In der Praxis
Angenommen, Sie haben wie in der OP-Frage 2 externe Eigenschaftendateien anzugeben und 1 Eigenschaftendatei im Uber-JAR.
So verwenden Sie nur die von Ihnen angegebenen Konfigurationsdateien:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
So fügen Sie diesen an den Standardspeicherorten Konfigurationsdateien hinzu:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties
ist im letzten Beispiel nicht erforderlich, da die Standardspeicherorte dies haben und die Standardspeicherorte hier nicht überschrieben, sondern erweitert werden.
application.properties
wird immer geladen, wobeispring.config.location
Sie zusätzliche Konfigurationsspeicherorte hinzufügen können, die auf Dateien überprüft werden (dh wenn es mit a endet/
). Wenn Sie dort jedoch eine durch Kommas getrennte Liste einfügen, die auf Dateien verweist, die geladen werden. Dies wird auch im Spring Boot Referenzhandbuch hier erklärt