Spring boot 1.X et Spring Boot 2.X ne fournissent pas les mêmes options et le même comportement sur le Externalized Configuration
.
La très bonne réponse de M. Deinum fait référence aux spécificités de Spring Boot 1.
Je vais mettre à jour pour Spring Boot 2 ici.
Sources et ordre des propriétés de l'environnement
Spring Boot 2 utilise un PropertySource
ordre très particulier conçu pour permettre le remplacement judicieux des valeurs. Les propriétés sont considérées dans l'ordre suivant:
Propriétés des paramètres globaux de Devtools sur votre répertoire personnel (~ / .spring-boot-devtools.properties lorsque devtools est actif).
@TestPropertySource
annotations sur vos tests.
@SpringBootTest#properties
attribut d'annotation sur vos tests. Arguments de ligne de commande.
Propriétés de SPRING_APPLICATION_JSON
(JSON en ligne incorporé dans une variable d'environnement ou une propriété système).
ServletConfig
paramètres init.
ServletContext
paramètres init.
Attributs JNDI de java:comp/env
.
Propriétés du système Java ( System.getProperties()
).
Variables d'environnement du système d'exploitation.
Un RandomValuePropertySource
qui a des propriétés uniquement au hasard. *
Propriétés d'application spécifiques au profil en dehors de votre jar emballé ( application-{profile}.properties
et des variantes YAML).
Propriétés d'application spécifiques au profil intégrées à votre fichier jar ( application-{profile}.properties
et variantes YAML).
Propriétés de l'application en dehors de votre jar emballé ( application.properties
et des variantes YAML).
Propriétés de l'application emballées dans votre fichier jar ( application.properties
et variantes YAML).
@PropertySource
annotations sur vos @Configuration
cours. Propriétés par défaut (spécifiées par le paramètre
SpringApplication.setDefaultProperties
).
Pour spécifier des fichiers de propriétés externes, ces options devraient vous intéresser:
Propriétés d'application spécifiques au profil en dehors de votre jar emballé ( application-{profile}.properties
et des variantes YAML).
Propriétés de l'application en dehors de votre jar emballé ( application.properties
et des variantes YAML).
@PropertySource
annotations sur vos @Configuration
cours. Propriétés par défaut (spécifiées par le paramètre
SpringApplication.setDefaultProperties
).
Vous ne pouvez utiliser qu'une seule de ces 3 options ou les combiner selon vos besoins.
Par exemple, pour des cas très simples, il suffit d'utiliser uniquement des propriétés spécifiques au profil, mais dans d'autres cas, vous souhaiterez peut-être utiliser à la fois les propriétés spécifiques au profil, les propriétés par défaut et @PropertySource
.
Emplacements par défaut des fichiers application.properties
À propos des application.properties
fichiers (et des variantes), par défaut, Spring les charge et ajoute leurs propriétés dans l'environnement à partir de ceux-ci dans l'ordre suivant:
Un sous-répertoire / config du répertoire courant
Le répertoire courant
Un package classpath / config
La racine du chemin de classe
Les priorités plus élevées sont donc littéralement:
classpath:/,classpath:/config/,file:./,file:./config/
.
Comment utiliser des fichiers de propriétés avec des noms spécifiques?
Les emplacements par défaut ne sont pas toujours suffisants: les emplacements par défaut comme le nom de fichier par défaut ( application.properties
) peuvent ne pas convenir. En outre, comme dans la question OP, vous devrez peut-être spécifier plusieurs fichiers de configuration autres que application.properties
(et variante).
Ce spring.config.name
ne sera donc pas suffisant.
Dans ce cas, vous devez fournir un emplacement explicite à l'aide de la spring.config.location
propriété d'environnement (qui est une liste d'emplacement de répertoire ou de chemin de fichier séparés par des virgules).
Pour être libre sur le modèle des noms de fichiers, privilégiez la liste des chemins de fichiers sur la liste des répertoires.
Par exemple, faites comme ça:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
C'est la manière la plus verbeuse que de spécifier simplement le dossier mais c'est aussi la manière de spécifier très finement nos fichiers de configuration et de documenter clairement les propriétés effectivement utilisées.
spring.config.location remplace désormais les emplacements par défaut au lieu de les ajouter
Avec Spring Boot 1, l' spring.config.location
argument ajoute des emplacements spécifiés dans l'environnement Spring.
Mais à partir de Spring Boot 2, spring.config.location
remplace les emplacements par défaut utilisés par Spring par les emplacements spécifiés dans l'environnement Spring, comme indiqué dans la documentation .
Lorsque les emplacements de configuration personnalisés sont configurés à l'aide de
spring.config.location
, ils remplacent les emplacements par défaut. Par exemple, si spring.config.location
est configuré avec la valeur
classpath:/custom-config/
, file:./custom-config/
l'ordre de recherche devient la suivante:
file:./custom-config/
classpath:custom-config/
spring.config.location
est maintenant un moyen de s'assurer que tout application.properties
fichier doit être spécifié explicitement.
Pour les JAR uber qui ne sont pas censés empaqueter des application.properties
fichiers, c'est plutôt bien.
Pour conserver l'ancien comportement spring.config.location
lors de l'utilisation de Spring Boot 2, vous pouvez utiliser la nouvelle spring.config.additional-location
propriété au lieu de spring.config.location
cela ajoute toujours les emplacements comme indiqué dans la documentation :
Sinon, lorsque les emplacements de configuration personnalisés sont configurés à l'aide de
spring.config.additional-location
, ils sont utilisés en plus des emplacements par défaut.
En pratique
Supposons donc que, comme dans la question OP, vous ayez 2 fichiers de propriétés externes à spécifier et 1 fichier de propriétés inclus dans le fichier uber jar.
Pour utiliser uniquement les fichiers de configuration que vous avez spécifiés:
-Dspring.config.location=classpath:/job1.properties,classpath:/job2.properties,classpath:/applications.properties
Pour y ajouter des fichiers de configuration aux emplacements par défaut:
-Dspring.config.additional-location=classpath:/job1.properties,classpath:/job2.properties
classpath:/applications.properties
n'est pas nécessaire dans le dernier exemple car les emplacements par défaut l'ont et que les emplacements par défaut ne sont pas ici écrasés mais étendus.
application.properties
sera toujours chargé, avecspring.config.location
vous pouvez ajouter des emplacements de configuration supplémentaires qui sont vérifiés pour les fichiers (c'est-à-dire quand il se termine par a/
) mais si vous y mettez une liste séparée par des virgules qui pointe vers les fichiers, ceux-ci seront chargés. Ceci est également expliqué dans le Guide de référence de Spring Boot ici