Wie aktiviere ich ein Spring Boot-Profil, wenn ich von IntelliJ aus laufe?

132

Ich habe 5 Umgebungen:

 - local (my development machine)
 - dev
 - qc
 - uat
 - live
 - staging

Ich möchte, dass für jede Umgebung unterschiedliche Anwendungseigenschaften verwendet werden. Daher habe ich die folgenden Eigenschaftendateien, die jeweils eine andere URL für die Datenquelle haben:

 - application.properties  (containing common properties)
 - application-local.properties
 - application-dev.properties
 - application-qc.properties
 - application-uat.properties
 - application-live.properties

Ich verwende IntelliJ und starte meine App mit bootRun im Gradle-Plugin auf meinem lokalen Computer. Ich werde dieselbe Application War-Datei in allen anderen Umgebungen bereitstellen, in denen Tomcat ausgeführt wird.

Ich habe versucht hinzuzufügen:

--spring.profiles.active = local

zur Ausführungskonfiguration unter Skriptparametern.

Ich habe versucht hinzuzufügen

-Dspring.profiles.active = lokal

zur Ausführungskonfiguration unter VM-Optionen.

Weder Arbeit. Ich sehe beim Start immer wieder die INFO-Meldung: Kein aktives Profil festgelegt, zurückgesetzt auf Standardprofile: Standard

Wenn ich meine App über die Windows-Befehlszeile mit ausführe

gradle bootRun

aber ich habe zuerst die Umgebungsvariable gesetzt

set SPRING_PROFILES_ACTIVE=local

Dann funktioniert alles.

Meine Frage ist also, wie ich mein lokales Spring-Boot-Profil aktiviere, wenn ich bootRun von IntelliJ aus starte.

Dleerob
quelle
1
Warum führen Sie die Anwendung dort über gradle aus? Wäre es nicht zehnmal bequemer, die Ausführungskonfiguration zu verwenden? Es gibt ein Feld, in dem Sie die Profile festlegen können, um zu aktivieren ...
Stephane Nicoll
Ich verwende die Ausführungskonfiguration in IntelliJ, wie oben erläutert. Es funktioniert nicht.
Dleerob
2
Nein, du bist nicht. Ich spreche von der "Spring Boot Run Konfiguration" Run -> Edit Configuration> New> Spring Boot.
Stephane Nicoll
Aah ja, ich habe mich von der Spring Boot-Ausführungskonfiguration entfernt, da ich project.properties in application.properties in meinem build.gradle erweitern musste. Wenn ich die Spring Boot-Ausführungskonfiguration verwendet habe, schien dies nicht zu funktionieren. Ich werde mich mit der Lösung dieses Problems
befassen
1
Die Verwendung der Spring Boot-Konfiguration scheint mehr Probleme als es wert ist. Das 'Make' kopiert einfach über die Ressourcen und filtert / ändert sie nicht gemäß Build-Skript. Wenn Sie dann sagen, dass der 'Build' von Gradle anstelle von 'Make' ausgeführt werden soll, friert der Lauf einfach ein. Wenn ich stattdessen bootRun zusammen mit meinem Umgebungseintrag gemäß der folgenden Antwort verwende, funktioniert alles einwandfrei.
Dleerob

Antworten:

193

Ich -Dspring.profiles.active=testhabe VM-Optionen hinzugefügt und diese Konfiguration erneut ausgeführt. Es hat perfekt funktioniert.

Dies kann eingestellt werden durch

  • Wählen Run | Edit Configurations...
  • Gehen Sie zur ConfigurationRegisterkarte
  • Erweitern Sie den EnvironmentAbschnitt, um ihn anzuzeigenVM options
Thom
quelle
Ich war in der gleichen Situation festgefahren, aber für ein Maven-Projekt. Danke für die Hilfe. Wir haben die VM-Option für jede einzelne Testdatei festgelegt.
Sri9911
2
Das funktioniert auch bei mir nicht. Ich benutze Gradle und zwei Module (API und
UI
1
Funktioniert auch bei mir nicht, auch hier mit gradle.
IARI
HI, ich habe das gleiche Problem, aber dieses Update behebt das Problem nicht. Was ist hier mit erneuter Konfiguration gemeint? ist es genauso wie die Aufgabe erneut auszuführen?
user1456110
Ich habe diesen speziellen Test ausgeführt, nachdem ich ihn wie gezeigt bearbeitet habe.
Thom
82

Wenn Sie tatsächlich Spring Boot Run-Konfigurationen verwenden (derzeit nur in der Ultimate Edition unterstützt), können Sie die Profile in der Einstellung "Aktive Profile" einfach vorkonfigurieren.

Geben Sie hier die Bildbeschreibung ein

Daniel Bubenheim
quelle
1
Vielen Dank, ich bin sicher, dass dies funktionieren würde. Ich verwende jedoch nicht die Spring Boot-Ausführungskonfiguration, sondern die Gradle-Ausführungskonfiguration ohne das Feld "Aktive Profile". Mein Gradle-Build filtert und ändert einige der Eigenschaftendateien, die er in das Build-Verzeichnis kopiert. Daher verwende ich hierfür die Grade-Run-Konfiguration.
Dleerob
Als obige Antwort darauf hingewiesen: Wenn dies für Sie nicht funktioniert, stellen Sie sicher, dass Sie argsin Ihrem Application.main()zBSpringApplication.run( Application.class, args );
Xaero Degreaz
Diese Funktion wird nur in der Ultimate Edition unterstützt.
Julien Malige
Vielen Dank an @JulienMalige für den Hinweis. Ich werde meine Antwort bearbeiten.
Daniel Bubenheim
11

Fügen Sie diesen Befehl in Ihr build.gradle ein

Geben Sie hier die Bildbeschreibung ein

Konfigurieren Sie zum Ausführen diese Form:

Geben Sie hier die Bildbeschreibung ein

Emerson Moura
quelle
9

Spring Boot hat anscheinend die Art und Weise, wie die VM-Optionen gelesen werden, im Laufe der Entwicklung geändert. Hier ist eine Möglichkeit, dies zu versuchen, wenn Sie eine Anwendung in Intellij starten und ein Profil aktivieren möchten:

1. Ändern Sie die VM-Optionen

Öffnen Sie "Konfiguration bearbeiten" unter "Ausführen" und fügen Sie unter "VM-Optionen" Folgendes hinzu: -Dspring.profiles.active=local

Es funktioniert tatsächlich mit einem meiner Projekte mit Spring Boot v2.0.3.RELEASEund Spring v5.0.7.RELEASE, aber nicht mit einem anderen Projekt mit Spring Boot v2.1.1.RELEASEund Spring v5.1.3.RELEASE.

Beim Laufen mit Maven oder JAR wurde Folgendes erwähnt:

mvn spring-boot:run -Drun.profiles=dev

oder

java -jar -Dspring.profiles.active=dev XXX.jar

(Siehe hier: Verwendung von Spring Boot-Profilen )

2. Übergeben von JVM-Argumenten

Es wird irgendwo erwähnt, dass Spring die Art und Weise des Startens des Anwendungsprozesses ändert, wenn Sie einige JVM-Optionen angeben. Es gabelt einen anderen Prozess und übergibt das empfangene Argument nicht, sodass dies nicht funktioniert. Der einzige Weg, um Argumente an ihn weiterzugeben, ist:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="..."

Auch dies ist für Maven. https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/run-debug.html

3. Einstellung (Anwendung) env var

Was für mich beim zweiten Projekt funktioniert, war das Festlegen der Umgebungsvariablen, wie in einer Antwort oben erwähnt: "Konfiguration bearbeiten" - "Umgebungsvariable" und:

SPRING_PROFILES_ACTIVE=local
WesternGun
quelle
1
Die env var sollte eigentlich sein SPRING_PROFILES_ACTIVE.
Josh M.
Ich habe es in "Konfiguration ausführen" von IDEA "VM-Optionen" wie "spring.profiles.active" hinzugefügt und es funktioniert. Vielleicht wird eine andere Form wie urs systemweit in den Systemeigenschaften verwendet?
WesternGun
Wenn Sie es hinzufügen ~/.profileoder ähnliches, müssen Sie verwenden SPRING_PROFILES_ACTIVE- spring.profiles.activefunktioniert wahrscheinlich nur als Argument in der Befehlszeile.
Josh M.
1
Ah ... also meinst du dasselbe, wie ich vermutet habe; reales System env nicht nur die Anwendung env. OK, ich mache eine Bearbeitung.
WesternGun
8

Am Ende habe ich meinem build.gradle Folgendes hinzugefügt:

bootRun {
  environment SPRING_PROFILES_ACTIVE: environment.SPRING_PROFILES_ACTIVE ?: "local"
}

test {
  environment SPRING_PROFILES_ACTIVE: environment.SPRING_PROFILES_ACTIVE ?: "test"
}

Wenn Sie also bootRun von IntelliJ aus ausführen, wird standardmäßig das "lokale" Profil verwendet.

In unseren anderen Umgebungen setzen wir einfach die Umgebungsvariable 'SPRING_PROFILES_ACTIVE' in Tomcat.

Ich habe dies aus einem Kommentar hier erhalten: https://github.com/spring-projects/spring-boot/pull/592

Dleerob
quelle
6

Eine wahrscheinliche Ursache könnte sein, dass Sie die Befehlszeilenparameter nicht an die Hauptmethode der Anwendung übergeben. Ich habe vor einigen Wochen den gleichen Fehler gemacht.

public static final void main(String... args) {
    SpringApplication.run(Application.class, args);
}
Hubert Ströbitzer
quelle
Vielen Dank für die Antwort und den Vorschlag, aber ich
gebe
Dies hat mein Problem tatsächlich behoben. Aus irgendeinem Grund wurde meine ApplicationKlasse beim Erstellen mit Gradle nicht automatisch generiert, sondern von Hand aus dem Speicher. Der argsSchritt wurde verpasst , und daher funktionierte das Feld "Aktive Profile" in der Ausführungskonfiguration nicht. Ich musste -Dspring.profiles.activedas Feld "VM-Optionen" manuell übergeben .
Xaero Degreaz
3

Ich benutze die Intellij Community Edition. Gehen Sie zu "Run / Debug Configurations"> Registerkarte "Runner"> "Umgebungsvariablen"> klicken Sie auf die Schaltfläche "...". Hinzufügen: SPRING_PROFILES_ACTIVE = local

spring.profiles.active

Ryan Wibawa
quelle
3

Für Spring Boot 2.1.0 und höher können Sie verwenden

mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar

Herr K.
quelle
2
In Ihrer Kommandozeile wird seinspring-boot:run -Dspring-boot.run.profiles=local
Herr K.
mit spring-boot: run das ist die
antwort
2

In meinem Fall, in dem ich die folgende Konfiguration bei VM-Optionen in verwendet habe IntelliJ, wurden nicht die lokalen Konfigurationen ausgewählt, sondern nach einem Neustart wurden IntelliJKonfigurationsdetails ausgewählt IntelliJund der Dienst wurde ausgeführt.

-Dspring.profiles.active=local
user2293536
quelle
0

Versuche dies. Bearbeiten Sie Ihre build.gradle-Datei wie folgt.

ext { profile = project.hasProperty('profile') ? project['profile'] : 'local' }
sudoz
quelle
0

Ersetzen Sie Ihren Profilnamen durch BE

Sie können den obigen Weg versuchen, um ein Profil zu aktivieren

Amrit Malla
quelle
-3

Stellen Sie -Dspring.profiles.active=localunter Programmargumente.

jwenting
quelle
Ich habe die Zitate aus meiner obigen Frage entfernt. Ich verwende eigentlich keine Anführungszeichen, ich habe nur versucht, genau zu zeigen, was ich in die
Laufkonfigurationsfelder eingefügt habe
5
du meinst VM-Optionen!
Michail Michailidis
Diese Antwort ist sehr irreführend, da Programmargumente von der Anwendung nicht erkannt werden!
Yuranos
Diese Antwort wird nicht funktionieren, wie von anderen Leuten erwähnt, sie sollte unter VM-Optionen in IntelliJ Idea und nicht in den Programmargumenten sein
abstractKarshit