Impostazione del profilo attivo e della posizione di configurazione dalla riga di comando in avvio di primavera


164

Ho un'applicazione per l'avvio a molla.

Ho tre profili nella mia applicazione-> sviluppo, messa in scena e produzione . Quindi ho 3 file

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

Il mio application.yml risiede all'interno src/main/resources. Ho impostato il profilo attivo in application.yml come:

spring:
  profiles.active: development

Gli altri 3 file di configurazione specifici del profilo sono presenti nella C:\configcartella.

Sto usando il plugin gradle per eclipse. Quando provo a fare un " bootRun ", sto impostando gli argomenti della riga di comando nella mia configurazione gradle in eclipse come

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

Tuttavia, la proprietà della riga di comando non viene riflessa e il mio profilo attivo viene sempre impostato come sviluppo (che è quello che ho menzionato nel file applicazioni.yml). Anche la cartella C: \ Config non viene cercata per i file di configurazione specifici del profilo.

Penso che mi manchi qualcosa qui. Ho cercato di capirlo negli ultimi 2 giorni. Ma niente fortuna. Gradirei davvero qualsiasi aiuto.


Potete per favore aggiungere anche la vostra bootRunlinea di comando
Biju Kunjummen,

Lo stavo eseguendo da eclissi e non dalla riga di comando fino ad ora. Ma ho provato a correre usando "gradle bootRun -Dspring.config.location = C: \ Config \ -Dspring.profiles.active = staging" e ho ottenuto lo stesso risultato.
O-OF-N,

Risposte:


341

Esistono due modi diversi per aggiungere / sovrascrivere le proprietà della molla nella riga di comando.

Opzione 1: Proprietà del sistema Java (argomenti VM)

È importante che i parametri -D siano prima dell'applicazione.jar altrimenti non vengono riconosciuti.

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

Opzione 2: argomenti del programma

java -jar application.jar --spring.profiles.active = prod --spring.config.location = c: \ config

45
L'ordine dei parametri -D è davvero importante :)
martin

3
come è possibile ottenere questo risultato durante la distribuzione per dire contenitore Tomcat? In quel caso ho semplicemente messo la mia guerra nella cartella webapps di tomcat, come posso fornire le informazioni sul profilo? impostando le proprietà di sistema?
prayagupd,

@prayagupd Sì, è possibile impostare le proprietà di sistema nel proprio bash_profile.
migliori auguri

2
@maneesh sì, sto usando la variabile env SPRING_PROFILES_ACTIVE esportata via ~/.bash_profile. export SPRING_PROFILES_ACTIVE=e2e
prayagupd,

1
Quando dici che l'ordine è importante: possiamo passare in entrambi gli argomenti: -Dspring.profile.active e -Dspring.config.location in modo tale che il profilo sia impostato in base al primo argomento e il file delle proprietà sia raccolto in base al secondo args? Ad esempio:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Pramod Setlur,

26

La mia migliore pratica è quella di definire questo come argomento "-D" della VM. Notare le differenze tra avvio a molla 1.xe 2.x.

I profili da abilitare possono essere specificati dalla riga di comando:

Spring-Boot 2.x

-Dspring-boot.run.profiles=local

Spring-Boot 1.x

-Dspring.profiles.active=local

esempio di utilizzo con 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

Assicurati di separarli con una virgola per più profili:

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

Intendi primavera / avvio a molla? (Primavera 1x e Primavera 2x)!
smilyface,

1
@smilyface avvio a molla. Spring Boot è disponibile anche in diverse versioni: mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma

2
Uso Spring-boot 2.1.3 e -Dspring-boot.run.profiles=localnon ha funzionato, ha -Dspring.profiles.active=localfunzionato.
Donghua Liu,

spring-boot 2.2.0: funziona sia: -Dspring-boot.run.profilesche-Dspring.profiles.active
Grigory Kislin il

17

Ho dovuto aggiungere questo:

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

E ora bootRun rileva il profilo e configura le posizioni.

Grazie mille @jst per il puntatore.


7
Questo può essere ancora più semplice come segue: bootRun { systemProperties = System.properties }. Questo comando copierà tutti i parametri passati con -Dswitch con gli stessi tasti alla systemPropertymappa.
edufinn,

questa sembra essere una soluzione unica, non esiste una soluzione genica?
user1767316

1
Dove lo stai aggiungendo esattamente? Ovunque nel file build.gradle o in una posizione specifica all'interno del file?
Entusiasta della Scala,

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

non è corretto.

dovrebbe essere:

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

3
Ciò causa l'errore "Opzione non riconosciuta: --spring.config.location"
James Watkins

-D è il modo corretto di impostare le proprietà del sistema Java. --something è un parametro bash.
Xdg,

--spring.profiles.active lavora per me, stessa cosa a cui ho fatto riferimento da docs.spring.io/spring-boot/docs/current/reference/html/…
Pushkar,

Questo funziona anche per me quando uso Run As -> Applicazione Java in Eclipse
Olivier Boissé

11
in realtà ENTRAMBI sono corretti, dipende da come viene utilizzato: può essere 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

è possibile utilizzare la seguente riga di comando:

java -jar -Dspring.profiles.active=[yourProfileName] target/[yourJar].jar

9

C'è un altro modo impostando la variabile del sistema operativo , SPRING_PROFILES_ACTIVE .

per esempio:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

Riferimento: come impostare i profili Spring attivi


Sì, e questo evita la necessità di confondersi con il modo in cui Gradle passa le proprietà del sistema all'applicazione.
ben3000,

Questo è il modo pulito. Dovrebbe anche essere usato per impostare utenti del database e password e altre configurazioni sensibili in modo che non vengano verificate nel controllo versione.
Igor Donin,

7

Quando si imposta il profilo tramite il plug-in Maven, è necessario farlo tramiterun.jvmArguments

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

Con opzione di debug:

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

Ho visto questo viaggio molte persone ... spero che sia d'aiuto


1
è stato modificato in mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar, consultare: docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…
rwenz3l

@ rwenz3l Grazie! che funziona per me, ho appena aggiornato un progetto da Spring Boot 1 a 2. Ora li aggiungo tutti nel mio bashrc ... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith,

5

Penso che il tuo problema sia probabilmente correlato alla tua posizione spring.config.loc che non termina il percorso con "/".

Cita i documenti

Se spring.config.location contiene directory (anziché file), devono terminare in / (e verranno aggiunti con i nomi generati da spring.config.name prima di essere caricati).

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


Grazie per averlo precisato. Tuttavia, quando eseguo -Dspring.profiles.active = stadiazione -Dspring.config.location = C: \ Config \ mi dà anche lo stesso problema. Anche il profilo attivo non viene riflesso. Penso che per qualche motivo la mia riga di comando non venga superata.
O-OF-N,

1
Si dovrebbe seguire il consiglio dato in questa domanda per passare i args per bootRun stackoverflow.com/questions/25079244/...
JST

Grazie. Questo ha davvero aiutato.
O-OF-N,

4

La risposta di Michael Yin è corretta ma sembra essere necessaria una spiegazione migliore!

Molti di voi hanno detto che -Dè il modo corretto di specificare i parametri JVM e avete assolutamente ragione. Ma Michael ha anche ragione, come menzionato in Spring Boot Profiles documentazione di .

Ciò che non è chiaro nella documentazione, è che tipo di parametro è: --spring.profiles.activenon è un parametro JVM standard quindi se vuoi usarlo nel tuo IDE compila i campi corretti (es. Argomenti del programma)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.