2015-03-17 33 views
16

Ho un'applicazione di avvio a molla che voglio eseguire con un file di configurazione esterno. Quando lo eseguo come jar (con il contenitore della servlet incorporato), tutto funziona correttamente. Ma voglio eseguirlo sotto un contenitore servlet esterno (Tomcat) e qui ho problemi con la configurazione esterna. Ho provato una @PropertySource, ma in questo caso l'applicazione ottiene solo le proprietà assenti nella configurazione del file di guerra: la configurazione esterna non sovrascrive la configurazione interna. Quindi la domanda: come posso configurare la configurazione esterna che sovrascriverà la configurazione interna?Configurazione esterna per l'applicazione di avvio a molla

risposta

20

Probabilmente si sta utilizzando la configurazione esterna sotto forma di application.properties nella directory corrente quando si esegue l'applicazione come jar. Tuttavia, "directory corrente" non è molto utile quando si distribuisce come guerra in un tomcat esterno. Anche se scopri qual è la directory corrente, è molto probabilmente la stessa posizione per tutte le applicazioni in esecuzione in quel tomcat, quindi quando stai utilizzando più di un'applicazione, non funzionerà molto bene.

Quello che facciamo qui è presente dichiarare due PropertySources sulla nostra applicazione:

@PropertySources({@PropertySource(value={"classpath:internal.properties"}), @PropertySource(value={"file:${application.properties}"})}) 

internal.properties contiene "costruito in" valori di default per propeties. Il secondo PropertySource è un file che contiene la configurazione esterna. Nota come il nome del file è di per sé una proprietà.

Abbiamo definire questo esternamente l'elemento Context della nostra applicazione (in Tomcat): si

<Context docBase="/path/to/your/war/your.war"> 
    <Parameter name="application.properties" value="/path/to/your/properties/application.properties"/> 
</Context> 

Questo permette di avere più applicazioni in esecuzione in Tomcat, ogni applicazione usando il suo file di proprie caratteristiche esterne. È anche possibile avere più istanze della stessa applicazione in esecuzione con proprietà diverse.

+1

Grazie per la risposta. Sì, questa configurazione funzionerà e come ho detto nella mia domanda ho provato questa soluzione. il problema di questa soluzione è che la configurazione esterna non sovrascrive la configurazione interna. La mia domanda è come posso impostare la priorità sulla configurazione esterna? –

+0

Dovrebbe funzionare, lo fa per me. Si noti che non sto utilizzando il nome predefinito application.properties, che avrebbe una priorità diversa. Sei sicuro di aver provato esattamente cosa c'è nella mia risposta? –

+0

Sì, funziona! :) Ho cambiato il nome della configurazione interna in internal.properties e funziona perfettamente. C'è un modo per ricaricare la configurazione esterna in fase di esecuzione? –

14

di esternare le application.properties Stivale Primavera quando si distribuisce come un file di guerra si può impostare spring.config.location all'inizio quando l'applicazione della molla di avvio è configurata:

public class Application extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) { 
     return springApplicationBuilder 
       .sources(Application.class) 
       .properties(getProperties()); 
    } 

    public static void main(String[] args) { 

     SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder(Application.class) 
       .sources(Application.class) 
       .properties(getProperties()) 
       .run(args); 
    } 

    static Properties getProperties() { 
     Properties props = new Properties(); 
     props.put("spring.config.location", "classpath:myapp1/"); 
     return props; 
    } 

Per ulteriori dettagli controllare questo solution.

+0

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire collegamento per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – Necreaux

+0

Ok @Necreaux parti essenziali sono state aggiunte –

+0

@Necreaux Non ho capito il downvote dopo aver aggiunto le parti essenziali? C'è ancora qualcosa che manca? –

6

Spring Boot offre many ways per specificare la posizione delle proprietà, non è necessario modificare le origini.

Yo può definire il valore spring.config.location ad esempio:

  • Nei tuoi tomcat/conf/Catalina/<host> contesto descrittori:

    <Context> 
        <Parameter name="spring.config.location" value="/path/to/application.properties" /> 
    </Context> 
    
  • Come parametro JVM nel file tomcat setenv.sh:

    -Dspring.config.location=/path/to/application.properties 
    
  • Come variabile di ambiente SPRING_CONFIG_LOCATION.

Problemi correlati