2014-05-09 5 views
15

Sto utilizzando l'avvio a molla e application.properties per selezionare un database durante lo sviluppo da @Configuration @Profile("dev").Come eseguire l'override di application.properties durante la produzione in Spring-Boot?

spring.profiles.active=dev 
spring.config.location=file:d:/application.properties 

Durante la produzione mi piacerebbe creare un file al di fuori del contesto applicativo che deve essere caricato e poi attivo un profilo di configurazione diversa, con D: /application.properties:

spring.profiles.active=production 

Risultato : quando avvio l'app, la configurazione è ancora dev, quindi in qualche modo la posizione aggiuntiva del file delle proprietà produttive non viene presa in considerazione. Mi sto perdendo qualcosa?

avvio primavera 1.1.0.BUILD-SNAPSHOT

Nota: questa domanda è NON circa Tomcat.

+3

lo farei il contrario, configurare per la produzione e l'override per dev/test. Se non sbaglio, 'spring.config.location' può essere impostato solo dalla riga di comando e non da un file delle proprietà. –

+3

spring.config.la posizione può essere configurata da una qualsiasi delle origini di proprietà supportate, non solo dalla riga di comando –

+1

Spring supporta ancora il meccanismo ProertyPlacholder? Se è così potresti volerlo esaminare. –

risposta

4

Non sono sicuro che sia possibile modificare i profili in modo dinamico.

Perché non basta avere un interne file delle proprietà con la proprietà spring.config.location impostato alla desiderata posizione di fuori, e archiviare le proprietà in quella posizione (al di fuori del vaso) hanno le spring.profiles. attivo insieme di proprietà?

Meglio ancora, avere un file di proprietà interno, specifico per il profilo dev (ha spring.profiles.active = dev) e lasciare che sia così, e quando si desidera distribuire in produzione, specificare una nuova posizione per il file delle proprietà , che ha spring.profiles.active = prod:

java -jar myjar.jar --spring.config.location=D:\wherever\application.properties 
+0

Ecco come intendevo: avere un file interno 'application.properties' che definisce' spring.config.location' e 'spring.profiles.active = dev' e sovrascrive esterno. Ma non funziona ... – membersound

+0

Non definire spring.config.location nel tuo file interno, basta specificarlo come argomento della riga di comando quando vuoi distribuire in produzione –

+3

Sì, sarebbe un'opzione, ma vorrei evitare di avere per dare qualsiasi argomento di cmd all'avvio. Soprattutto quando lo stivale primaverile afferma di supportare questo ... – membersound

2

UPDATE: questo è un bug in primavera vedono here

le proprietà di applicazione al di fuori del vostro vaso deve essere in uno dei seguenti posti, quindi tutto dovrebbe funzionare

21.2 Application property files 
SpringApplication will load properties from application.properties files in the following locations and add them to the Spring Environment: 

A /config subdir of the current directory. 
The current directory 
A classpath /config package 
The classpath root 

quindi ad es. questo dovrebbe funzionare, se non volete specificare argomenti della riga di cmd e tu non utilizzare spring.config.location nei tuoi app.props di base:

d:\yourExecutable.jar 
d:\application.properties 

or 

d:\yourExecutable.jar 
d:\config\application.properties 

vedere spring external config doc

Aggiornamento: si può usare \ @ Configurazione insieme a \ @PropertySource. in base al documento here è possibile specificare le risorse ovunque. dovresti fare attenzione, quando viene caricata la configurazione per assicurarti che la tua produzione vince.

+1

OK che potrebbe funzionare su un jar eseguibile, che è fantastico! Ma che dire di un'applicazione web tomcat? Come posso caricare un file di proprietà simile alla directory 'config' al di fuori dell'applicazione di guerra distribuita? Perché quando ridistribuisco l'app, tutte le sottocartelle create andranno perse. – membersound

+1

con propertysource dovrebbe funzionare fino a quando la tua versione di primavera è abbastanza buona per esso vedi aggiornamento –

+0

@dasAnderl Il problema con '@PropertySource' per il caricamento delle proprietà durante la distribuzione di una guerra è che le proprietà di registrazione saranno ignorate e il sistema di registrazione non lavoro. Verifica questa alternativa [soluzione] (http://stackoverflow.com/questions/31017064/how-to-externalize-spring-boot-application-properties-to-tomcat-lib-folder/31027378#31027378) –

5

È inoltre possibile utilizzare @PropertySources

@PropertySources({ 
     @PropertySource(value = "classpath:application.properties"), 
     @PropertySource(value = "file:/user/home/external.properties", ignoreResourceNotFound = true) 
}) 
public class Application { 
    public static void main(String[] args) throws Exception { 
     ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); 

    } 


} 
+1

non funziona su spring-boot 1.3.0.RELEASE – dfa

Problemi correlati