File application.properties specifico dell'ambiente nell'applicazione Spring Boot [chiuso]


87

Nella mia applicazione Spring Boot, voglio creare un file delle proprietà specifico dell'ambiente. Il tipo di packaging della mia applicazione in guerra e lo sto eseguendo in tomcat incorporato. Uso le m ed eseguo la principale dalle m stesse.

  1. Posso avere un file delle proprietà specifiche dell'ambiente come application - $ {env-value} .properties?

Nel caso precedente, env-value avrà valori come local / devl / test / prod

  1. Dove impostare il file env-value? Per locale, posso impostarlo come argomento jvm tramite sts

  2. Chi legge application.properties nell'applicazione Spring Boot.

  3. Come caricare il file delle proprietà specifiche dell'ambiente? Ad esempio, se imposto l'UID del database, il PWD, lo schema ecc. Nel file delle proprietà specifico dell'ambiente, in tal caso l'origine dati sarà in grado di comprendere le proprietà in esso contenute?

  4. Posso utilizzare i file application.properties e application-local.properties contemporaneamente?


Hai letto questo ? Fondamentalmente è supportato out-of-the-box.
M. Deinum

L'ho fatto ma non funziona. Quindi ho il file application.properties e il file application-local.properties nella stessa posizione. Il file application-local.properties contiene le proprietà relative al database. application.properties ha una sola proprietà in essa relativa a spring mvc. Inoltre ho aggiunto -Dprofile = local come configurazione di debug ma questo valore non viene rilevato
user3534483

perché è necessario impostare in spring.active.profilesmodo da utilizzare -Dspring.active.profiles=local. anziché.
M. Deinum

Nessun successo signore. quindi invece di -Dprofile, ora sto usando -Dspring.active.profiles = local. E poi nel mio file di configurazione cerco di recuperare il valore String driverClassName = env.getProperty ("driverClassName"); env è l'ambiente dalla primavera
user3534483

1
Scusa il mio male, l'ho mescolato in giro :).
M. Deinum

Risposte:


173

Spring Boot ha già il supporto per le proprietà basate sul profilo .

Basta aggiungere un application-[profile].propertiesfile e specificare i profili da utilizzare utilizzando la spring.profiles.activeproprietà.

-Dspring.profiles.active=local

Questo caricherà il application.propertiese il application-local.propertiescon le ultime proprietà che sovrascrivono dal primo.


1
È possibile sostituire l'utilizzo delle proprietà dell'applicazione con un altro file per un profilo specifico senza caricarli entrambi? Per test o sviluppo ad esempio?
Hassam Abdelillah

1
M. Deinum, anch'io ho un problema simile, ho application.yml e application-qa.yml e ho dato -Dspring.profiles.active = qa, entrambi i file vengono letti ma le proprietà di application-qa.yml non sovrascrivono il proprietà da application.yml, vedo sempre solo le proprietà da application.yml? c'è un modo per specificare la priorità?
Suresh

5
Ciao entrambi, questo può risolvere i tuoi problemi. docs.spring.io/spring-boot/docs/current/reference/html/… Esempio: mkyong.com/spring-boot/…
Anand Varkey Philips

Sto scrivendo codice per aws lambda e posso passare questa chiave = valore come valore dell'ambiente, a cui è possibile accedere utilizzando System.getenv (), funzionerà?
Abdeali Chandanwala

Ho 4 file application- {profile} .properties. E voglio eseguire lo stesso file jar in un ambiente diverso, diciamo dev, test, prod. Quindi non posso usare -Dspring.profiles.active = local. Gentilmente correggimi se mi manca qualcosa.
Ashish Burnwal

25

Si, puoi. Dato che stai usando la primavera, controlla l' @PropertySourceannotazione.

Anota la tua configurazione con

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

Puoi chiamarlo come preferisci e aggiungere più file di proprietà, se lo desideri. Può essere utile se hai più set e / o impostazioni predefinite che appartengono a tutti gli ambienti (possono essere scritti anche con @PropertySource {..., ..., ...}).

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

Quindi puoi avviare l'applicazione con environment

-Dspring.active.profiles=test

In questo esempio, nome verrà sostituito con proprietà-test-applicazione e così via.


3
Il problema è che $spring.profiles.active}è una stringa separata da matrice / virgola. Quindi potrebbe non fare quello che ti aspetti / vuoi che faccia quando ci sono più profili attivi.
M. Deinum

Questo è vero, ma funziona bene per due profili: uno predefinito e uno definito con PropertySource. Per una gestione più avanzata della proprietà, penso che dovrai guardare fuori dalla primavera. Inoltre PropertySource viene letto solo durante l'avvio. Altre librerie più avanzate per la gestione delle proprietà possono modificare anche le proprietà in fase di esecuzione.
Tzen

2
Ha funzionato, ma ancora non capisco perché ho dovuto farlo manualmente. In uno dei miei altri repository non ho dovuto farlo.
The Java Guy

7

possiamo fare così:

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

e in application-local.yml :

server:
  address: 0.0.0.0
  port: 8080

quindi l'avvio di primavera avvierà la nostra app come desideriamo.


2
Non stai codificando il profilo attivo in questo modo ?? :(
Anna Medyukh

0

Il mio punto, IN questo modo arent chiedendo allo sviluppatore di creare tutto l'ambiente correlato in una volta sola, con conseguente rischio di esporre la configurazione di produzione allo sviluppatore finale

secondo 12-Factor, non dovrebbe essere specifico per l'ambiente risiedere solo in Enviornment.

Come facciamo per CI CD

  • Costruisci Spring una volta e promuovi in ​​un altro ambiente, in tal caso, se abbiamo spring jar ha tutto l'ambiente, sarà un rischio per la sicurezza, avendo tutte le variabili di ambiente in GIT
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.