Spring Boot 1.X e Spring Boot 2.X non forniscono le stesse opzioni e comportamenti per il Externalized Configuration .
L'ottima risposta di M. Deinum si riferisce alle specificità di Spring Boot 1.
Aggiornerò per Spring Boot 2 qui.
Fonti e ordine delle proprietà dell'ambiente
Spring Boot 2 utilizza un PropertySourceordine molto particolare progettato per consentire una sostituzione ragionevole dei valori. Le proprietà sono considerate nel seguente ordine:
Proprietà delle impostazioni globali di Devtools nella directory home (~ / .spring-boot-devtools.properties quando devtools è attivo).
@TestPropertySource annotazioni sui tuoi test.
@SpringBootTest#propertiesattributo annotation sui tuoi test. Argomenti della riga di comando.
Proprietà da SPRING_APPLICATION_JSON(JSON in linea incorporato in una variabile di ambiente o in una proprietà di sistema).
ServletConfig parametri di inizializzazione.
ServletContext parametri di inizializzazione.
Attributi JNDI da java:comp/env.
Proprietà del sistema Java ( System.getProperties()).
Variabili di ambiente del sistema operativo.
A RandomValuePropertySourceche ha proprietà solo in modo casuale. *.
Proprietà dell'applicazione specifiche del profilo al di fuori del vaso confezionato ( application-{profile}.propertiese delle varianti YAML).
Proprietà dell'applicazione specifiche del profilo contenute nel tuo jar ( application-{profile}.propertiese varianti YAML).
Proprietà dell'applicazione all'esterno del vaso confezionato ( application.propertiese varianti YAML).
Proprietà dell'applicazione confezionate all'interno del tuo jar ( application.propertiese varianti YAML).
@PropertySourceannotazioni sulle tue @Configurationclassi. Proprietà predefinite (specificate dall'impostazione
SpringApplication.setDefaultProperties).
Per specificare i file delle proprietà esterne, queste opzioni dovrebbero interessarti:
Proprietà dell'applicazione specifiche del profilo al di fuori del vaso confezionato ( application-{profile}.propertiese delle varianti YAML).
Proprietà dell'applicazione all'esterno del vaso confezionato ( application.propertiese varianti YAML).
@PropertySourceannotazioni sulle tue @Configurationclassi. Proprietà predefinite (specificate dall'impostazione
SpringApplication.setDefaultProperties).
È possibile utilizzare solo una di queste 3 opzioni o combinarle in base alle proprie esigenze.
Ad esempio, per casi molto semplici è sufficiente utilizzare solo proprietà specifiche del profilo, ma in altri casi è possibile utilizzare sia le proprietà specifiche del profilo, sia le proprietà predefinite e @PropertySource.
Percorsi predefiniti per i file application.properties
Per quanto riguarda i application.propertiesfile (e le varianti), per impostazione predefinita Spring li carica e aggiunge le loro proprietà nell'ambiente da questi nel seguente ordine:
Una sottodirectory / config della directory corrente
La directory corrente
Un pacchetto classpath / config
La radice del percorso di classe
Le priorità più elevati sono così alla lettera:
classpath:/,classpath:/config/,file:./,file:./config/.
Come utilizzare i file delle proprietà con nomi specifici?
Le posizioni predefinite non sono sempre sufficienti: le posizioni predefinite come il nome file predefinito ( application.properties) potrebbero non essere adatte. Inoltre, come nella domanda OP potrebbe essere necessario specificare più file di configurazione diversi da application.properties(e variant).
Quindi spring.config.namenon sarà abbastanza.
In questo caso è necessario fornire una posizione esplicita utilizzando la spring.config.locationproprietà environment (che è un elenco separato da virgole di posizioni di directory o percorsi di file).
Per essere libero sul pattern dei nomi dei file, prediligi l'elenco dei percorsi dei file rispetto all'elenco delle directory.
Ad esempio fai così:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
In questo modo è il più dettagliato quello che specifica solo la cartella ma è anche il modo per specificare molto finemente i nostri file di configurazione e per documentare chiaramente le proprietà effettivamente utilizzate.
spring.config.location ora sostituisce le posizioni predefinite invece di aggiungerle
Con Spring Boot 1, l' spring.config.locationargomento aggiunge posizioni specificate nell'ambiente Spring.
Ma da Spring Boot 2, spring.config.locationsostituisce le posizioni predefinite utilizzate da Spring con le posizioni specificate nell'ambiente Spring come indicato nella documentazione .
Quando le posizioni di configurazione personalizzate vengono configurate utilizzando
spring.config.location, sostituiscono le posizioni predefinite. Per esempio, se spring.config.locationè configurato con il valore
classpath:/custom-config/, file:./custom-config/l'ordine di ricerca diventa la seguente:
file:./custom-config/
classpath:custom-config/
spring.config.locationè ora un modo per assicurarsi che qualsiasi application.propertiesfile debba essere specificato esplicitamente.
Per i JAR uber che non dovrebbero impacchettare application.propertiesfile, è piuttosto carino.
Per mantenere il vecchio comportamento spring.config.locationdurante l'utilizzo di Spring Boot 2 è possibile utilizzare la nuova spring.config.additional-locationproprietà invece di spring.config.locationaggiungere ancora le posizioni come indicato dalla documentazione :
In alternativa, quando le posizioni di configurazione personalizzate vengono configurate utilizzando
spring.config.additional-location, vengono utilizzate in aggiunta alle posizioni predefinite.
In pratica
Supponiamo quindi che, come nella domanda OP, tu abbia 2 file delle proprietà esterne da specificare e 1 file delle proprietà incluso nel vaso uber.
Per utilizzare solo i file di configurazione specificati:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
Per aggiungere file di configurazione a questi nelle posizioni predefinite:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties nell'ultimo esempio non è richiesto poiché le posizioni predefinite hanno quello e quelle posizioni predefinite qui non vengono sovrascritte ma estese.
application.propertiessarà sempre essere caricato, conspring.config.locationè possibile aggiungere ulteriori posizioni di configurazione che vengono controllati per i file (cioè quando si termina con una/) se si mette una virgola separati in là che punta al file di coloro che verranno caricati. Questo è anche spiegato nella Spring Boot Reference Guide qui