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 PropertySource
ordine 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#properties
attributo 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 RandomValuePropertySource
che ha proprietà solo in modo casuale. *.
Proprietà dell'applicazione specifiche del profilo al di fuori del vaso confezionato ( application-{profile}.properties
e delle varianti YAML).
Proprietà dell'applicazione specifiche del profilo contenute nel tuo jar ( application-{profile}.properties
e varianti YAML).
Proprietà dell'applicazione all'esterno del vaso confezionato ( application.properties
e varianti YAML).
Proprietà dell'applicazione confezionate all'interno del tuo jar ( application.properties
e varianti YAML).
@PropertySource
annotazioni sulle tue @Configuration
classi. 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}.properties
e delle varianti YAML).
Proprietà dell'applicazione all'esterno del vaso confezionato ( application.properties
e varianti YAML).
@PropertySource
annotazioni sulle tue @Configuration
classi. 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.properties
file (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.name
non sarà abbastanza.
In questo caso è necessario fornire una posizione esplicita utilizzando la spring.config.location
proprietà 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.location
argomento aggiunge posizioni specificate nell'ambiente Spring.
Ma da Spring Boot 2, spring.config.location
sostituisce 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.properties
file debba essere specificato esplicitamente.
Per i JAR uber che non dovrebbero impacchettare application.properties
file, è piuttosto carino.
Per mantenere il vecchio comportamento spring.config.location
durante l'utilizzo di Spring Boot 2 è possibile utilizzare la nuova spring.config.additional-location
proprietà invece di spring.config.location
aggiungere 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.properties
sarà 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