webentwicklung-frage-antwort-db.com.de

Wie überschreibe ich application.properties während der Produktion in Spring-Boot?

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 .

32
membersound

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.

10
Kalpesh Soni

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);

    }


}
10
Saurabh

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
7
Gabriel Ruiu

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.

4

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 

  • [möglicherweise mehrere Schichten von] 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.
1
avi.elkharrat

Ab Spring Boot 2 müssen Sie --spring.config.additional-location=production.properties

Die Federkonfiguration hat folgende Priorität.

  1. ServletConfig-Init-Parameter
  2. ServletContext-Init-Parameter
  3. JNDI-Attribute 
  4. System.getProperties ()

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.

0
Himadri Mandal