Festlegen des aktiven Profils und des Konfigurationsorts über die Befehlszeile im Frühjahrsstart

163

Ich habe eine Spring Boot-Anwendung.

Ich habe drei Profile in meiner Anwendung -> Entwicklung, Inszenierung und Produktion . Ich habe also 3 Dateien

  1. application-development.yml
  2. application-staging.yml
  3. application-product.yml

Meine application.yml befindet sich im Inneren src/main/resources. Ich habe das aktive Profil in application.yml wie folgt festgelegt:

spring:
  profiles.active: development

Die anderen 3 profilspezifischen Konfigurationsdateien befinden sich im C:\configOrdner.

Ich benutze Gradle Plugin für Eclipse. Wenn ich versuche, einen " bootRun " durchzuführen , setze ich die Befehlszeilenargumente in meiner Gradle-Konfiguration in Eclipse als

 -Dspring.profiles.active=staging -Dspring.config.location=C:\Config

Die Befehlszeileneigenschaft wird jedoch nicht wiedergegeben und mein aktives Profil wird immer als Entwicklung festgelegt (das ist das, das ich in der Datei applications.yml erwähnt habe). Auch der Ordner C: \ Config wird nicht nach profilspezifischen Konfigurationsdateien durchsucht.

Ich glaube, mir fehlt hier etwas. Ich habe in den letzten 2 Tagen versucht, es herauszufinden. Aber kein Glück. Ich würde mich über jede Hilfe sehr freuen.

O-OF-N
quelle
Können Sie bitte auch Ihre bootRunKommandozeile hinzufügen
Biju Kunjummen
Ich habe es von Eclipse und bis jetzt nicht über die Befehlszeile ausgeführt. Ich habe jedoch versucht, "gradle bootRun -Dspring.config.location = C: \ Config \ -Dspring.profiles.active = staging" zu verwenden, und habe das gleiche Ergebnis erzielt.
O-OF-N

Antworten:

340

Es gibt zwei verschiedene Möglichkeiten, Federeigenschaften in der Befehlszeile hinzuzufügen / zu überschreiben.

Option 1: Java-Systemeigenschaften (VM-Argumente)

Es ist wichtig, dass die -D-Parameter vor Ihrer application.jar liegen, da sie sonst nicht erkannt werden.

java -jar -Dspring.profiles.active=prod application.jar


Option 2: Programmargumente

java -jar application.jar --spring.profiles.active=prod --spring.config.location=c:\config
RenRen
quelle
45
Die Reihenfolge der -D-Parameter ist wirklich wichtig :)
Martin
3
Wie können Sie dies erreichen, während Sie beispielsweise Tomcat-Container bereitstellen? In diesem Fall lege ich meinen Krieg einfach in den Webapps-Ordner von Tomcat. Wie kann ich die Profilinformationen bereitstellen? durch Festlegen von Systemeigenschaften?
Prayagupd
@prayagupd Ja, Sie können Systemeigenschaften in Ihrem bash_profile festlegen.
Beste Wünsche
2
@maneesh Ja, ich verwende die über export exportierte env-Variable . SPRING_PROFILES_ACTIVE~/.bash_profileexport SPRING_PROFILES_ACTIVE=e2e
Prayagupd
1
Wenn Sie sagen, dass die Reihenfolge wichtig ist: Können wir beide Argumente übergeben: -Dspring.profile.active und -Dspring.config.location, sodass das Profil gemäß dem ersten Argument festgelegt und die Eigenschaftendatei gemäß dem zweite Argumente? ZB:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Pramod Setlur
25

Meine beste Vorgehensweise besteht darin, dies als VM "-D" -Argument zu definieren. Bitte beachten Sie die Unterschiede zwischen Spring Boot 1.x und 2.x.

Die zu aktivierenden Profile können in der Befehlszeile angegeben werden:

Spring-Boot 2.x.

-Dspring-boot.run.profiles=local

Spring-Boot 1.x.

-Dspring.profiles.active=local

Beispiel für die Verwendung mit Maven:

Spring-Boot 2.x.

mvn spring-boot:run -Dspring-boot.run.profiles=local

Spring-Boot 1.x.

mvn spring-boot:run -Dspring.profiles.active=local

Stellen Sie sicher, dass Sie sie für mehrere Profile durch ein Komma trennen:

mvn spring-boot:run -Dspring.profiles.active=local,foo,bar
mvn spring-boot:run -Dspring-boot.run.profiles=local,foo,bar
Sma Ma
quelle
Du meinst Frühling / Frühlingsstiefel? (Feder 1x und Feder 2x)!
Smilyface
1
@smilyface Federstiefel. Spring Boot ist auch in verschiedenen Versionen erhältlich: mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma
2
Ich benutze Spring-Boot 2.1.3 und -Dspring-boot.run.profiles=localhabe nicht funktioniert, hat -Dspring.profiles.active=localfunktioniert.
Donghua Liu
spring-boot 2.2.0: arbeite beide: -Dspring-boot.run.profilesund-Dspring.profiles.active
Grigory Kislin
17

Ich musste Folgendes hinzufügen:

bootRun {
    String activeProfile =  System.properties['spring.profiles.active']
    String confLoc = System.properties['spring.config.location']
    systemProperty "spring.profiles.active", activeProfile
    systemProperty "spring.config.location", "file:$confLoc"
}

Und jetzt nimmt bootRun die Profil- und Konfigurationsspeicherorte auf.

Vielen Dank @jst für den Zeiger.

O-OF-N
quelle
7
Dies kann wie folgt noch einfacher sein : bootRun { systemProperties = System.properties }. Dieser Befehl kopiert alle mit dem -DSchalter übergebenen Parameter mit denselben Tasten, die zugeordnet werden sollen systemProperty.
Edufinn
Dies scheint nur eine Gradle-Lösung zu sein. Gibt es keine genetische Lösung?
user1767316
1
Wo genau fügen Sie das hinzu? Irgendwo in der build.gradle-Datei oder an einem bestimmten Ort in der Datei?
Scala Enthusiast
16
-Dspring.profiles.active=staging -Dspring.config.location=C:\Config

das ist nicht richtig.

sollte sein:

--spring.profiles.active=staging --spring.config.location=C:\Config
Michael Yin
quelle
3
Dies verursacht den Fehler "Nicht erkannte Option: --spring.config.location"
James Watkins
-D ist der richtige Weg, um Java-Systemeigenschaften festzulegen. --Etwas ist ein Bash-Parameter.
Xdg
--spring.profiles.active Arbeit für mich, das gleiche, was ich von docs.spring.io/spring-boot/docs/current/reference/html/…
Pushkar
Dies funktioniert auch für mich bei Verwendung von Ausführen als -> Java-Anwendung in Eclipse
Olivier Boissé
11
tatsächlich sind beide richtig, es hängt davon ab, wie es verwendet wird: es kann sein java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarORjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config
Dexter Legaspi
9

Sie können die folgende Befehlszeile verwenden:

java -jar -Dspring.profiles.active=[yourProfileName] target/[yourJar].jar
Rollen Holt
quelle
9

Es gibt eine andere Art und Weise durch die Einstellung OS Variable, SPRING_PROFILES_ACTIVE .

für zB:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

Referenz: So legen Sie aktive Federprofile fest

Rothin Sen.
quelle
Ja, und dies vermeidet die Notwendigkeit, sich mit der Art und Weise zu beschäftigen, wie Gradle die Systemeigenschaften an die Anwendung weitergibt.
Ben3000
Dies ist der ordentliche Weg. Es sollte auch verwendet werden, um Datenbankbenutzer und Kennwörter sowie andere vertrauliche Konfigurationen festzulegen, damit diese nicht in der Versionskontrolle überprüft werden.
Igor Donin
7

Wenn Sie das Profil über das Maven-Plugin einstellen , müssen Sie dies über tunrun.jvmArguments

mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=production"

Mit Debug-Option:

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -Dspring.profiles.active=jpa"

Ich habe diese Reise viele Leute gesehen ... hoffentlich hilft es

JARC
quelle
1
hat sich geändert zu mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar, siehe: docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…
rwenz3l
@ rwenz3l Danke! das funktioniert für mich, habe gerade ein Projekt von Spring Boot 1 auf 2 aktualisiert. Jetzt füge ich sie einfach alle in meinem bashrc hinzu ... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith
5

Ich denke, Ihr Problem hängt wahrscheinlich damit zusammen, dass Ihre spring.config.location den Pfad nicht mit "/" beendet.

Zitieren Sie die Dokumente

Wenn spring.config.location Verzeichnisse enthält (im Gegensatz zu Dateien), sollten diese mit / enden (und vor dem Laden an die aus spring.config.name generierten Namen angehängt werden).

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files

jst
quelle
Vielen Dank für den Hinweis. Wenn ich jedoch -Dspring.profiles.active = staging -Dspring.config.location = C: \ Config \ ausführe, tritt das gleiche Problem auf. Selbst ein aktives Profil wird nicht reflektiert. Ich denke aus irgendeinem Grund wird meine Kommandozeile nicht übergangen.
O-OF-N
1
Sie sollten den Ratschlägen in dieser Frage folgen, um die Argumente an bootRun stackoverflow.com/questions/25079244/…
jst
Danke dir. Das hat wirklich geholfen.
O-OF-N
4

Michael Yins Antwort ist richtig, aber eine bessere Erklärung scheint erforderlich zu sein!

Viele von Ihnen haben erwähnt, dass dies -Dder richtige Weg ist, um JVM-Parameter anzugeben, und Sie haben absolut Recht. Aber Michael hat auch Recht, wie in der Dokumentation zu Spring Boot Profiles erwähnt.

Was in der Dokumentation nicht klar ist, ist, um welche Art von Parameter es sich handelt: Es --spring.profiles.activehandelt sich nicht um einen Standard-JVM-Parameter. Wenn Sie ihn also in Ihrer IDE verwenden möchten, füllen Sie die richtigen Felder aus (dh Programmargumente).

Eric Taix
quelle
0

Wenn Sie Gradle verwenden:

-Pspring.profiles.active=local
FredFlinstone
quelle