Ich benutze Spring Boot und application.properties
, um eine Datenbank während der Entwicklung von @Configuration @Profile("dev")
auszuwählen.
spring.profiles.active=dev
spring.config.location=file:d:/application.properties
Ich möchte während der Produktion eine Datei außerhalb des Anwendungskontexts erstellen, die geladen werden soll und dann ein anderes Konfigurationsprofil mit d: /application.properties aktiviert:
spring.profiles.active=production
Ergebnis: Wenn ich die App starte, ist die Konfiguration immer noch dev
, sodass der zusätzliche Speicherort der produktiven Eigenschaftendatei irgendwie nicht berücksichtigt wird. Fehlt mir etwas?
spring Boot 1.1.0.BUILD-SNAPSHOT
Hinweis: Diese Frage istNICHTüber Tomcat .
Ich weiß, du hast gefragt, wie das geht.
Aber die Antwort ist, Sie sollten das nicht tun.
Sie können application.properties application-default.properties application-dev.properties usw haben
sie können Profile über Befehlszeilenargumente zum jvm wechseln
mit @TestPropertySource können Sie zur Testzeit einige Dinge überschreiben
Idealerweise sollte alles in der Quellcodeverwaltung sein, damit es keine Überraschungen gibt. Woher wissen Sie, welche Eigenschaften sich an Ihrem Serverstandort befinden und welche nicht vorhanden sind. Was passiert, wenn Entwickler neue Dinge einführen?.
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
Spring Boot bietet Ihnen bereits genug Möglichkeiten, dies richtig zu machen.
Sie können auch @PropertySources
verwenden.
@PropertySources({
@PropertySource(value = "classpath:application.properties"),
@PropertySource(value = "file:/user/home/external.properties", ignoreResourceNotFound = true)
})
public class Application {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
}
}
Ich bin nicht sicher, ob Sie Profile dynamisch ändern können.
Warum nicht einfach eine internal -Eigenschaftsdatei mit der spring.config.location -Eigenschaft auf den gewünschten externen Speicherort setzen, und die Eigenschaftsdatei an diesem Speicherort (außerhalb der jar) die spring.profiles hat .active - Eigenschaftssatz?
Besser noch, haben Sie eine interne Eigenschaftendatei, die spezifisch für dev-Profile ist (hat spring.profiles.active = dev), und lassen Sie es so, und wenn Sie es in der Produktion bereitstellen möchten, geben Sie einen neuen Speicherort für Ihre Eigenschaftendatei an, der Frühling hat .profiles.active = Prod:
Java -jar myjar.jar --spring.config.location=D:\wherever\application.properties
UPDATE: Dies ist ein Fehler im Frühling, siehe hier
die Anwendungseigenschaften außerhalb Ihres Tiegels müssen sich an einer der folgenden Stellen befinden, dann sollte alles funktionieren.
21.2 Application property files
SpringApplication will load properties from application.properties files in the following locations and add them to the Spring Environment:
A /config subdir of the current directory.
The current directory
A classpath /config package
The classpath root
so z. Dies sollte funktionieren, wenn Sie keine cmd-Zeilenargumente angeben möchten und spring.config.location nicht in Ihrer Basisanwendung app.props verwenden:
d:\yourExecutable.jar
d:\application.properties
or
d:\yourExecutable.jar
d:\config\application.properties
siehe spring external config doc
Update: Sie können\@Configuration zusammen mit\@PropertySource . Verwenden. Entsprechend dem doc hier können Sie Ressourcen beliebig angeben. Sie sollten nur vorsichtig sein, wenn welche config geladen wird, um sicherzustellen, dass Ihre Produktion gewinnt.
Ich habe festgestellt, dass folgendes für mich funktioniert hat:
Java -jar my-awesome-Java-prog.jar --spring.config.location=file:/path-to-config-dir/
mitfile:
hinzugefügt.
LATE EDIT
Natürlich ist diese Befehlszeile niemals wie in der Produktion ausgeführt.
Eher habe ich
Shell
-Skripts in der Quellcodeverwaltung mit Platzhaltern für alle Teile des Befehls, die geändert werden könnten (Name der jar, Pfad zur Konfiguration ...)ansible
-Implementierungsskripts, die die Shell
-Skripts implementieren und die Platzhalter durch den tatsächlichen Wert ersetzen.Ab Spring Boot 2 müssen Sie --spring.config.additional-location=production.properties
Die Federkonfiguration hat folgende Priorität.
Wenn Sie dies möchten, wird Ihre Konfiguration in der Befehlszeile überschrieben. Es wird jedoch empfohlen, das Überschreiben zu vermeiden, obwohl Sie mehrere Profile verwenden können.