Ustawianie aktywnego profilu i lokalizacji konfiguracji z wiersza poleceń podczas rozruchu wiosennego

164

Mam aplikację do rozruchu sprężynowego.

Mam trzy profile w mojej aplikacji -> programowanie, przygotowywanie i produkcja . Więc mam 3 pliki

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

Moja application.yml znajduje się w środku src/main/resources. Ustawiłem aktywny profil w application.yml jako:

spring:
  profiles.active: development

Pozostałe 3 pliki konfiguracyjne specyficzne dla profilu znajdują się w C:\configfolderze.

Używam wtyczki Gradle do Eclipse. Kiedy próbuję wykonać " bootRun ", ustawiam argumenty wiersza poleceń w mojej konfiguracji gradle w eclipse jako

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

Jednak właściwość wiersza poleceń nie jest odzwierciedlana, a mój aktywny profil jest zawsze ustawiany jako programistyczny (czyli ten, o którym wspomniałem w pliku applications.yml). Również folder C: \ Config nie jest przeszukiwany pod kątem plików konfiguracyjnych specyficznych dla profilu.

Myślę, że czegoś tu brakuje. Próbowałem to rozgryźć przez ostatnie 2 dni. Ale bez szczęścia. Naprawdę doceniłbym każdą pomoc.

O-OF-N
źródło
Czy możesz dodać również swoją bootRunlinię poleceń
Biju Kunjummen
Do tej pory uruchamiałem go z zaćmienia, a nie z wiersza poleceń. Ale próbowałem uruchomić z "gradle bootRun -Dspring.config.location = C: \ Config \ -Dspring.profiles.active = staging" i otrzymałem ten sam wynik.
O-OF-N,

Odpowiedzi:

341

Istnieją dwa różne sposoby dodawania / zastępowania właściwości sprężyny w wierszu poleceń.

Opcja 1: Właściwości systemu Java (argumenty maszyny wirtualnej)

Ważne jest, aby parametry -D znajdowały się przed plikiem application.jar, w przeciwnym razie nie zostaną rozpoznane.

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

Opcja 2: Programowanie argumentów

java -jar application.jar --spring.profiles.active = prod --spring.config.location = c: \ config
RenRen
źródło
45
Kolejność parametrów -D jest naprawdę ważna :)
martin
3
jak możesz to osiągnąć, wdrażając np. kontener Tomcat? W takim przypadku po prostu umieszczam wojnę w folderze aplikacji internetowych tomcat, jak mam podać informacje o profilu? ustawiając właściwości systemu?
prayagupd
@prayagupd Tak, możesz ustawić właściwości systemu w swoim bash_profile.
najlepsze życzenia
2
@maneesh tak, używam zmiennej env SPRING_PROFILES_ACTIVE wyeksportowanej za pośrednictwem ~/.bash_profile. export SPRING_PROFILES_ACTIVE=e2e
prayagupd
1
Kiedy mówisz, że kolejność jest ważna: Czy możemy przekazać oba argumenty: -Dspring.profile.active i -Dspring.config.location w taki sposób, że profil jest ustawiany zgodnie z pierwszym argumentem, a plik właściwości jest pobierany zgodnie z drugie argumenty? Np .:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Pramod Setlur
26

Moją najlepszą praktyką jest zdefiniowanie tego jako argumentu „-D” maszyny wirtualnej. Zwróć uwagę na różnice między butem sprężynowym 1.x i 2.x.

Profile do włączenia można określić w wierszu poleceń:

Spring-Boot 2.x

-Dspring-boot.run.profiles=local

Spring-Boot 1.x

-Dspring.profiles.active=local

Przykładowe użycie z 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

Pamiętaj, aby oddzielić je przecinkami dla wielu profili:

mvn spring-boot:run -Dspring.profiles.active=local,foo,bar
mvn spring-boot:run -Dspring-boot.run.profiles=local,foo,bar
Sma Ma
źródło
Masz na myśli wiosnę / wiosnę? (Wiosna 1x i Wiosna 2x)!
smilyface
1
Buty sprężynowe @smilyface. Spring boot jest również dostępny w różnych wersjach: mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma
2
Używam spring-boot 2.1.3 i -Dspring-boot.run.profiles=localnie działało, -Dspring.profiles.active=localdziałało.
Donghua Liu
spring-boot 2.2.0: działają zarówno: jak -Dspring-boot.run.profilesi-Dspring.profiles.active
Grigorij Kislin
17

Musiałem to dodać:

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"
}

A teraz bootRun wybiera lokalizacje profilu i konfiguracji.

Wielkie dzięki @jst za wskaźnik.

O-OF-N
źródło
7
To może być nawet bardziej prostsze w następujący sposób: bootRun { systemProperties = System.properties }. To polecenie skopiuje wszystkie parametry przekazane za pomocą -Dprzełącznika z tymi samymi kluczami do systemPropertymapowania.
edufinn,
wydaje się, że jest to tylko rozwiązanie dla stopni, czy nie ma rozwiązania genrycznego?
user1767316
1
Gdzie dokładnie to dodajesz? Gdziekolwiek w pliku build.gradle lub w określonej lokalizacji w pliku?
Scala Enthusiast
16
-Dspring.profiles.active=staging -Dspring.config.location=C:\Config

nie jest poprawne.

Powinien być:

--spring.profiles.active=staging --spring.config.location=C:\Config
Michael Yin
źródło
3
Powoduje to błąd „Nierozpoznana opcja: --spring.config.location”
James Watkins
-D to poprawny sposób ustawiania właściwości systemu Java. - coś jest parametrem basha.
Xdg
--spring.profiles.active work for me, same rzeczy, o których wspomniałem z docs.spring.io/spring-boot/docs/current/reference/html/ ...
Pushkar
Działa to również w przypadku mnie, gdy używam Run As -> aplikacji Java w Eclipse
Olivier Boissé
11
właściwie OBA są poprawne, zależy to od tego, jak jest używane: może być java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarLUBjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config
Dexter Legaspi
9

możesz użyć następującego wiersza poleceń:

java -jar -Dspring.profiles.active=[yourProfileName] target/[yourJar].jar
Rollen Holt
źródło
9

Istnieje inny sposób, ustawiając zmienną systemu operacyjnego , SPRING_PROFILES_ACTIVE .

na przykład:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

Odniesienie: Jak ustawić aktywne profile sprężyn

Rothin Sen
źródło
Tak, a to pozwala uniknąć grzebania w sposobie, w jaki Gradle przekazuje właściwości systemu do aplikacji.
ben3000
To jest zgrabny sposób. Powinien być również używany do ustawiania użytkowników bazy danych i haseł oraz innych wrażliwych konfiguracji, aby nie były sprawdzane w kontroli wersji.
Igor Donin
7

Ustawiając profil za pomocą wtyczki Maven należy to zrobić za pomocąrun.jvmArguments

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

Z opcją debugowania:

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

Widziałem tę wycieczkę wiele osób… mam nadzieję, że to pomoże

JARC
źródło
1
zmienił się na mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar, zobacz: docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…
rwenz3l
@ rwenz3l Dzięki! to działa, właśnie zaktualizowałem projekt z Spring Boot 1 do 2. Teraz po prostu dodaję je wszystkie w moim bashrc ... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith
5

Myślę, że twój problem jest prawdopodobnie związany z tym, że twoja spring.config.location nie kończy ścieżki znakiem „/”.

Cytuj dokumenty

Jeśli spring.config.location zawiera katalogi (w przeciwieństwie do plików), powinny one kończyć się na / (i przed załadowaniem do nich zostaną dodane nazwy wygenerowane z spring.config.name).

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

jst
źródło
Dziękuję za zwrócenie uwagi. Jednak gdy uruchamiam -Dspring.profiles.active = staging -Dspring.config.location = C: \ Config \, również pojawia się ten sam problem. Nawet aktywny profil nie jest odzwierciedlany. Myślę, że z jakiegoś powodu mój wiersz poleceń nie jest pomijany.
O-OF-N,
1
Powinieneś postępować zgodnie z radą podaną w tym pytaniu, aby przekazać argumenty do bootRun stackoverflow.com/questions/25079244/ ...
jst
Dziękuję Ci. To naprawdę pomogło.
O-OF-N
4

Odpowiedź Michaela Yina jest poprawna, ale wydaje się, że potrzebne jest lepsze wyjaśnienie!

Wielu z Was wspomniało, że -Djest to właściwy sposób określania parametrów JVM i macie całkowitą rację. Ale Michael ma również rację, jak wspomniano w Spring Boot Profiles dokumentacji .

W dokumentacji nie jest jasne, jakiego rodzaju jest to parametr: --spring.profiles.activenie jest to standardowy parametr JVM, więc jeśli chcesz go użyć w swoim IDE, wypełnij odpowiednie pola (tj. Argumenty programu)

Eric Taix
źródło
0

Jeśli używasz Gradle:

-Pspring.profiles.active=local
FredFlinstone
źródło