Umgebungsspezifische Datei application.properties in der Spring Boot-Anwendung [geschlossen]

85

In meiner Spring Boot-Anwendung möchte ich eine umgebungsspezifische Eigenschaftendatei erstellen. Der Verpackungstyp meiner Anwendung im Krieg und ich führe sie in Embedded Tomcat aus. Ich benutze sts und führe das main von sts selbst aus.

  1. Kann ich eine umgebungsspezifische Eigenschaftendatei wie application - $ {env-value} .properties haben?

Im obigen Fall hat env-value Werte wie local / devl / test / prod

  1. Wo soll die env-Wert-Datei eingestellt werden? Für local kann ich es durch sts als jvm-Argument festlegen

  2. Wer liest die application.properties in der Spring Boot-Anwendung?

  3. Wie lade ich die umgebungsspezifische Eigenschaftendatei? Wenn ich zum Beispiel die Datenbank-UID, das PWD, das Schema usw. in einer umgebungsspezifischen Eigenschaftendatei festlege, kann die Datenquelle in diesem Fall die darin enthaltenen Eigenschaften verstehen?

  4. Kann ich die Dateien application.properties und application-local.properties gleichzeitig verwenden?

user3534483
quelle
Haben Sie lesen diese ? Es wird grundsätzlich sofort unterstützt.
M. Deinum
Ich habe es getan, aber das funktioniert nicht. Ich habe also die Datei application.properties und die Datei application-local.properties am selben Speicherort. Die Datei application-local.properties enthält db-bezogene Eigenschaften. application.properties hat eine einzige Eigenschaft in Bezug auf Spring MVC. Außerdem habe ich -Dprofile = local als Debug-Konfiguration hinzugefügt, aber dieser Wert wird nicht
erfasst
weil du spring.active.profilesso einstellen musst -Dspring.active.profiles=local. stattdessen.
M. Deinum
Kein Erfolg, Sir. Anstelle von -Dprofile verwende ich jetzt -Dspring.active.profiles = local. Und dann versuche ich in meiner Konfigurationsdatei den Wert String driverClassName = env.getProperty ("driverClassName") abzurufen; env ist die Umwelt vom Frühjahr
user3534483
1
Sorry mein schlechtes, gemischt es herum :).
M. Deinum

Antworten:

170

Frühlings - Boot bereits hat die Unterstützung für Profil basierter Eigenschaften.

Fügen Sie einfach eine application-[profile].propertiesDatei hinzu und geben Sie die zu verwendenden Profile mithilfe der spring.profiles.activeEigenschaft an.

-Dspring.profiles.active=local

Dadurch werden die application.propertiesund die application-local.propertiesmit letzteren überschreibenden Eigenschaften von der ersten geladen .

M. Deinum
quelle
1
Können wir die Verwendung von Anwendungseigenschaften mit einer anderen Datei für ein bestimmtes Profil überschreiben, ohne beide zu laden? Für Tests oder Entwickler zum Beispiel?
Hassam Abdelillah
1
M. Deinum, auch ich habe ein ähnliches Problem, ich habe application.yml und application-qa.yml und ich habe -Dspring.profiles.active = qa angegeben. Beide Dateien werden gelesen, aber die Eigenschaften von application-qa.yml überschreiben das nicht Eigenschaften aus application.yml, ich sehe immer nur Eigenschaften aus application.yml? Gibt es eine Möglichkeit, die Priorität anzugeben?
Suresh Chaganti
5
Hallo beide, dies kann deine Probleme lösen. docs.spring.io/spring-boot/docs/current/reference/html/… Beispiel: mkyong.com/spring-boot/…
Anand Varkey Philips
Ich schreibe Code für aws lambda und kann diesen Schlüssel = Wert als Umgebungswert übergeben - auf den mit System.getenv () zugegriffen werden kann - wird es funktionieren?
Abdeali Chandanwala
Ich habe 4 application- {profile} .properties-Datei. Und ich möchte dieselbe JAR-Datei in einer anderen Umgebung ausführen, sagen wir dev, test, prod. Also kann ich -Dspring.profiles.active = local nicht verwenden. Bitte korrigieren Sie mich, wenn mir etwas fehlt.
Ashish Burnwal
24

Ja, du kannst. Da Sie Feder verwenden, @PropertySourcelesen Sie die Anotation.

Kommentieren Sie Ihre Konfiguration mit

@PropertySource("application-${spring.profiles.active}.properties")

Sie können es so nennen, wie Sie möchten, und bei Bedarf mehrere Eigenschaftendateien hinzufügen. Kann nett sein, wenn Sie mehr Sätze und / oder Standardeinstellungen haben, die zu allen Umgebungen gehören (kann auch mit @PropertySource {..., ..., ...} geschrieben werden).

@PropertySources({
  @PropertySource("application-${spring.profiles.active}.properties"),
  @PropertySource("my-special-${spring.profiles.active}.properties"),
  @PropertySource("overridden.properties")})

Anschließend können Sie die Anwendung mit der Umgebung starten

-Dspring.active.profiles=test

In diesem Beispiel wird der Name durch Anwendungstest-Eigenschaften usw. ersetzt.

Tzen
quelle
2
Das Problem ist, dass $spring.profiles.active}es sich um eine Array / Komma-getrennte Zeichenfolge handelt. Es kann also sein, dass es nicht das tut, was Sie erwarten / wollen, wenn mehrere Profile aktiv sind.
M. Deinum
Das stimmt, funktioniert aber gut für zwei Profile - ein Standardprofil und eines, die mit PropertySource definiert wurden. Ich denke, Sie müssen außerhalb des Frühlings nachsehen, um eine erweiterte Immobilienverwaltung zu erhalten. Außerdem wird PropertySource nur beim Start gelesen. Andere, erweiterte Bibliotheken für die Behandlung von Eigenschaften können auch die Laufzeit von Eigenschaften ändern.
Tzen
2
Das hat funktioniert, aber ich verstehe immer noch nicht, warum ich das manuell machen musste. In einem meiner anderen Repositorys musste ich das nicht tun.
Der Java-
7

wir können so machen:

in application.yml :

spring:
  profiles:
    active: test //modify here to switch between environments
    include:  application-${spring.profiles.active}.yml

in application-test.yml :

server:
  port: 5000

und in application-local.yml :

server:
  address: 0.0.0.0
  port: 8080

dann startet spring boot unsere app wie wir wollen.

Tintenfisch
quelle
2
Codieren Sie das aktive Profil nicht auf diese Weise fest? :(
Anna Medyukh
0

Mein Punkt: Auf diese Weise wird der Entwickler nicht gebeten, alle Umgebungen in einem Schritt zu erstellen, was zu dem Risiko führt, dass die Produktionskonfiguration dem Endentwickler ausgesetzt wird

Gemäß 12-Faktor sollte nicht nur die Umgebung spezifisch in der Umgebung sein.

Wie machen wir das für CI CD?

  • Erstellen Sie Spring einmal und fördern Sie es in eine andere Umgebung. In diesem Fall besteht ein Sicherheitsrisiko, wenn Spring Jar die gesamte Umgebung hat und alle Umgebungsvariablen in GIT variabel sind
Karthik_Rajendiran
quelle