Ich habe mehrere Eigenschaftendateien, die ich aus dem Klassenpfad laden möchte. Es gibt einen Standardsatz, unter /src/main/resources
dem ein Teil von ist myapp.jar
. Ich springcontext
erwarte, dass sich Dateien im Klassenpfad befinden. dh
<util:properties id="Job1Props"
location="classpath:job1.properties"></util:properties>
<util:properties id="Job2Props"
location="classpath:job2.properties"></util:properties>
Ich brauche auch die Option, um diese Eigenschaften mit einem externen Satz zu überschreiben. Ich habe einen externen Konfigurationsordner in cwd
. Gemäß Spring Boot sollte sich der Konfigurationsordner im Klassenpfad befinden. Aus dem Dokument ist jedoch nicht ersichtlich, ob nur die applicaiton.properties
von dort oder alle Eigenschaften in der Konfiguration überschrieben werden .
Wenn ich es getestet habe, wird es nur application.properties
abgeholt und der Rest der Immobilien wird noch abgeholt /src/main/resources
. Ich habe versucht, sie als durch Kommas getrennte Liste anzugeben, spring.config.location
aber der Standardsatz wird immer noch nicht überschrieben.
Wie kann ich dafür sorgen, dass mehrere externe Konfigurationsdateien die Standarddateien überschreiben?
Als Problemumgehung habe ich derzeit app.config.location
(app-spezifische Eigenschaft) verwendet, die ich über die Befehlszeile bereitstelle. dh
java -jar myapp.jar app.config.location=file:./config
und ich änderte meine applicationcontext
zu
<util:properties id="Job2Props"
location="{app.config.location}/job2.properties"></util:properties>
Und so trenne ich beim Laden von Application zwischen Datei und Klassenpfad.
EDITS:
//psuedo code
if (StringUtils.isBlank(app.config.location)) {
System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}
Ich möchte die obige Problemumgehung wirklich nicht verwenden und alle externen Konfigurationsdateien im Klassenpfad wie bei der application.properties
Datei durch Spring überschreiben lassen .
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ärtAntworten:
Bei Verwendung von Spring Boot werden die Eigenschaften in der folgenden Reihenfolge geladen (siehe Externalisierte Konfiguration im Spring Boot-Referenzhandbuch).
Beim Auflösen von Eigenschaften (dh das
@Value("${myprop}")
Auflösen erfolgt in umgekehrter Reihenfolge (also beginnend mit 9).Um verschiedene Dateien hinzuzufügen, können Sie die
spring.config.location
Eigenschaften verwenden, die eine durch Kommas getrennte Liste von Eigenschaftendateien oder Dateispeicherorten (Verzeichnissen) enthalten.Das obige fügt ein Verzeichnis hinzu, das nach
application.properties
Dateien durchsucht wird.Dadurch werden die 2 Eigenschaftendateien zu den geladenen Dateien hinzugefügt.
Die Standardkonfigurationsdateien und -speicherorte werden vor den zusätzlich angegebenen geladen
spring.config.location
, was bedeutet, dass letztere die in den vorherigen festgelegten Eigenschaften immer überschreiben. (Siehe auch diesen Abschnitt des Spring Boot-Referenzhandbuchs).UPDATE: Da das Verhalten von spring.config.location jetzt den Standard überschreibt, anstatt ihn hinzuzufügen. Sie müssen spring.config.additional-location verwenden, um die Standardeinstellungen beizubehalten. Dies ist eine Verhaltensänderung von 1.x auf 2.x.
quelle
application.properties
und konsultiertapplication-[env].properties
. Andere Eigenschaftendateien werden nicht berücksichtigt. Dies wird auch im Referenzhandbuch angegeben (im Abschnitt, zu dem der Link führt, und im Zitat aus dem Referenzhandbuch).config.location
und wie sieconfig.names
interagieren, obwohl es für Personen, die bereits wissen, wie sie interagieren, wahrscheinlich klar zu sein scheint. Können Sie Ihre Antwort aktualisieren, um der Dokumentation etwas hinzuzufügen ?spring.config.location
jetzt den Standard überschreibt, anstatt ihn hinzuzufügen. Sie müssen verwendenspring.config.additional-location
, um die Standardeinstellungen beizubehalten. Dies ist eine Verhaltensänderung von 1.x auf 2.x.Beim Spring-Boot funktioniert die Datei spring.config.location. Geben Sie lediglich durch Kommas getrennte Eigenschaftendateien an.
siehe den folgenden Code
Man kann die Standardversion von jdbc.properties in die Anwendung einfügen. Hier können die externen Versionen eingestellt werden.
Basierend auf dem mit der Eigenschaft spring.profiles.active festgelegten Profilwert wird der Wert von jdbc.host erfasst. Also wann (unter Windows)
jdbc.host übernimmt den Wert von jdbc-dev.properties.
zum
jdbc.host übernimmt den Wert von jdbc.properties.
quelle
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:Um externe Eigenschaftendateien anzugeben, sollten Sie folgende Optionen interessieren:
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 alsapplication.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:
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 .spring.config.location
Auf diese Weise können Sie jetzt sicherstellen, dass eineapplication.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 neuespring.config.additional-location
Eigenschaft verwenden. Stattdessen werdenspring.config.location
weiterhin die in der Dokumentation angegebenen Speicherorte hinzugefügt :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:
So fügen Sie diesen an den Standardspeicherorten Konfigurationsdateien hinzu:
classpath:/applications.properties
ist im letzten Beispiel nicht erforderlich, da die Standardspeicherorte dies haben und die Standardspeicherorte hier nicht überschrieben, sondern erweitert werden.quelle
application.properties
mit allen Parametern und mehrere${file_name}.properties
mit teilweise definierten Eigenschaftensätzen lesen . Wenn Sie also@PropertySource
oder andere starke Links zu Dateien verwenden, können Sie andere externe Dateien erstellen und diese Eigenschaften überschreiben (z. B. vonclasspath:file.properties
).Werfen Sie einen Blick auf den PropertyPlaceholderConfigurer. Ich finde ihn klarer zu verwenden als Anmerkungen.
z.B
quelle
Dies ist ein einfacher Ansatz mit Federstiefel
TestClass.java
den Kontext app.properties an Ihrem ausgewählten Speicherort
Ihre Spring Boot-Anwendung
und den vordefinierten Kontext application.properties
Sie können beliebig viele Konfigurationsklassen schreiben und diese aktivieren / deaktivieren, indem Sie spring.profiles.active festlegen = den Profilnamen / die Profilnamen {durch Kommas getrennt}
Wie Sie sehen können, ist Spring Boot großartig. Es braucht nur einige Zeit, um sich damit vertraut zu machen. Erwähnenswert ist, dass Sie @Value auch auf Ihren Feldern verwenden können
quelle
Ich hatte das gleiche Problem. Ich wollte die Möglichkeit haben, eine interne Konfigurationsdatei beim Start mit einer externen Datei zu überschreiben, ähnlich der Erkennung von Spring Boot application.properties. In meinem Fall handelt es sich um eine user.properties-Datei, in der die Benutzer meiner Anwendungen gespeichert sind.
Meine Anforderungen:
Laden Sie die Datei von den folgenden Speicherorten (in dieser Reihenfolge)
Ich habe die folgende Lösung gefunden:
Jetzt verwendet die Anwendung die Klassenpfadressource, sucht jedoch auch an den anderen angegebenen Speicherorten nach einer Ressource. Die letzte vorhandene Ressource wird ausgewählt und verwendet. Ich kann meine App mit java -jar myapp.jar --properties.location = / directory / myproperties.properties starten, um einen Eigenschaftenspeicherort zu verwenden, der mein Boot schwimmt.
Ein wichtiges Detail hier: Verwenden Sie eine leere Zeichenfolge als Standardwert für die Eigenschaft properties.location in der Annotation @Value, um Fehler zu vermeiden, wenn die Eigenschaft nicht festgelegt ist.
Die Konvention für einen properties.location lautet: Verwenden Sie ein Verzeichnis oder einen Pfad zu einer Eigenschaftendatei als properties.location.
Wenn Sie nur bestimmte Eigenschaften überschreiben möchten, kann eine PropertiesFactoryBean mit setIgnoreResourceNotFound (true) verwendet werden, wobei das Ressourcenarray als Speicherorte festgelegt ist.
Ich bin sicher, dass diese Lösung erweitert werden kann, um mehrere Dateien zu verarbeiten ...
BEARBEITEN
Hier meine Lösung für mehrere Dateien :) Wie zuvor kann dies mit einer PropertiesFactoryBean kombiniert werden.
quelle
Mit Spring Boot können wir verschiedene Profile schreiben, um für verschiedene Umgebungen zu schreiben. Beispielsweise können wir separate Eigenschaftendateien für Produktions-, QA- und lokale Umgebungen haben
Die Datei application-local.properties mit Konfigurationen gemäß meinem lokalen Computer ist
Ebenso können wir application-prod.properties und application-qa.properties so viele Eigenschaftendateien schreiben, wie wir möchten
Schreiben Sie dann einige Skripte, um die Anwendung für verschiedene Umgebungen zu starten, z
quelle
Ich hatte gerade ein ähnliches Problem und habe schließlich die Ursache herausgefunden: Die Datei application.properties hatte die falschen Besitz- und rwx-Attribute. Als Tomcat gestartet wurde, befand sich die Datei application.properties am richtigen Speicherort, gehörte jedoch einem anderen Benutzer:
quelle
Eine modifizierte Version der @ mxsb-Lösung, mit der wir mehrere Dateien definieren können. In meinem Fall handelt es sich um XML-Dateien.
In meiner application-dev.yml habe ich diese Konfiguration hinzugefügt, mit der ich alle yml-Dateien mit -dev.yml einfügen kann. Dies kann auch eine Liste bestimmter Dateien sein. "Klassenpfad: /test/test.yml, Klassenpfad: /test2/test.yml"
Dies hilft, eine Eigenschaftskarte zu erhalten.
Wenn ich jedoch wie in meinem Fall wollte, musste ich yml-Dateien für jedes Profil teilen und laden und diese vor der Initialisierung der Beans direkt in die Spring-Konfiguration einfügen.
... Du hast die Idee
Die Komponente ist etwas anders
}}
quelle
Wenn Sie die in Ihrer Datei application.properties angegebenen Werte überschreiben möchten, können Sie Ihr aktives Profil ändern, während Sie Ihre Anwendung ausführen, und eine Anwendungseigenschaftendatei für das Profil erstellen. Geben Sie beispielsweise das aktive Profil "override" an. Anschließend können Sie unter der Annahme, dass Sie Ihre neue Anwendungseigenschaftendatei mit dem Namen "application-override.properties" unter / tmp erstellt haben, ausführen
Die unter spring.config.location angegebenen Werte werden in umgekehrter Reihenfolge ausgewertet. In meinem Beispiel wird also zuerst der Klassenpatient und dann der Dateiewert ausgewertet.
Wenn sich die JAR-Datei und die Datei "application-override.properties" im aktuellen Verzeichnis befinden, können Sie sie einfach verwenden
da Spring Boot die Eigenschaftendatei für Sie findet
quelle
Ich habe festgestellt, dass dies ein nützliches Muster ist:
Hier überschreiben wir die Verwendung von "application.yml", um "application-MyTest_LowerImportance.yml" und auch "application-MyTest_MostImportant.yml" zu verwenden
(Spring sucht auch nach .properties-Dateien).
Als zusätzlichen Bonus sind auch die Debug- und Trace-Einstellungen in einer separaten Zeile enthalten, damit Sie sie bei Bedarf auskommentieren können.]
Das Debuggen / Trace ist unglaublich nützlich, da Spring die Namen aller geladenen und der zu ladenden Dateien speichert.
Zur Laufzeit werden in der Konsole folgende Zeilen angezeigt:
quelle
Ich bin auf viele Probleme gestoßen, als ich versucht habe, dies herauszufinden. Hier ist mein Setup,
Dev Env: Windows 10, Java: 1.8.0_25, Spring Boot: 2.0.3.RELEASE, Spring: 5.0.7.RELEASE
Was ich gefunden habe, ist, dass der Frühling am Konzept "Sinnvolle Standardeinstellungen für die Konfiguration" festhält. Dies bedeutet, dass Sie alle Ihre Eigenschaftendateien als Teil Ihrer Kriegsdatei haben müssen. Dort können Sie sie mit der Befehlszeileneigenschaft "--spring.config.additional-location" überschreiben, um auf externe Eigenschaftendateien zu verweisen. Dies funktioniert jedoch NICHT, wenn die Eigenschaftendateien nicht Teil der ursprünglichen Kriegsdatei sind.
Demo-Code: https://github.com/gselvara/spring-boot-property-demo/tree/master
quelle