J'ai plusieurs fichiers de propriétés que je souhaite charger à partir du chemin de classe. Il existe un ensemble par défaut sous /src/main/resources
lequel fait partie de myapp.jar
. Mon springcontext
s'attend à ce que les fichiers soient sur le chemin des classes. c'est à dire
<util:properties id="Job1Props"
location="classpath:job1.properties"></util:properties>
<util:properties id="Job2Props"
location="classpath:job2.properties"></util:properties>
J'ai également besoin de l'option pour remplacer ces propriétés avec un ensemble externe. J'ai un dossier de configuration externe dans cwd
. Selon le dossier de configuration de la documentation de démarrage de printemps, il doit se trouver sur le chemin de classe. Mais ce n'est pas clair de la doc s'il ne remplacera que le à applicaiton.properties
partir de là ou toutes les propriétés de config.
Lorsque je l'ai testé, il n'est application.properties
récupéré que et le reste des propriétés est toujours récupéré /src/main/resources
. J'ai essayé de les fournir sous forme de liste séparée par des virgules, spring.config.location
mais le jeu par défaut n'est toujours pas remplacé.
Comment faire pour que plusieurs fichiers de configuration externes remplacent ceux par défaut?
Comme solution de contournement, j'utilise actuellement app.config.location
(propriété spécifique à l'application) que je fournis via la ligne de commande. c'est à dire
java -jar myapp.jar app.config.location=file:./config
et j'ai changé mon applicationcontext
en
<util:properties id="Job2Props"
location="{app.config.location}/job2.properties"></util:properties>
Et c'est ainsi que je fais la séparation entre le fichier et le chemin de classe lors du chargement de l'application.
MODIFIER:
//psuedo code
if (StringUtils.isBlank(app.config.location)) {
System.setProperty(APP_CONFIG_LOCATION, "classpath:");
}
Je voudrais vraiment ne pas utiliser la solution de contournement ci-dessus et que le ressort remplace tous les fichiers de configuration externes sur le chemin de classe comme il le fait pour le application.properties
fichier.
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 iciRéponses:
Lors de l'utilisation de Spring Boot, les propriétés sont chargées dans l'ordre suivant (voir Configuration externalisée dans le guide de référence Spring Boot).
Lors de la résolution des propriétés (c'est-à-dire que la
@Value("${myprop}")
résolution se fait dans l'ordre inverse (donc en commençant par 9).Pour ajouter différents fichiers, vous pouvez utiliser les
spring.config.location
propriétés qui prennent une liste de fichiers de propriétés séparés par des virgules ou l'emplacement des fichiers (répertoires).Celui ci-dessus ajoutera un répertoire qui sera consulté pour les
application.properties
fichiers.Cela ajoutera les 2 fichiers de propriétés aux fichiers chargés.
Les fichiers de configuration et les emplacements par défaut sont chargés avant
spring.config.location
ceux spécifiés de manière supplémentaire , ce qui signifie que ces derniers remplaceront toujours les propriétés définies dans les précédents. (Voir également cette section du Guide de référence de Spring Boot).MISE À JOUR: Comme le comportement de spring.config.location remplace désormais la valeur par défaut au lieu d'y ajouter. Vous devez utiliser spring.config.additional-location pour conserver les valeurs par défaut. Il s'agit d'un changement de comportement de 1.x à 2.x
la source
application.properties
etapplication-[env].properties
. Il ne prend pas en compte les autres fichiers de propriétés. Ceci est également indiqué dans le guide de référence (dans la section le lien mène vers et le devis du guide de référence).config.location
et commentconfig.names
interagir, bien que cela semble probablement clair pour les personnes qui savent déjà comment elles interagissent. Pouvez-vous mettre à jour votre réponse pour ajouter quelque chose à la documentation?spring.config.location
now remplace la valeur par défaut au lieu d'y ajouter. Vous devez utiliserspring.config.additional-location
pour conserver les valeurs par défaut. Il s'agit d'un changement de comportement de 1.x à 2.x.Avec Spring boot, le spring.config.location fonctionne, il suffit de fournir des fichiers de propriétés séparés par des virgules.
voir le code ci-dessous
on peut mettre la version par défaut de jdbc.properties dans l'application. Les versions externes peuvent être définies ici.
En fonction de la valeur du profil définie à l'aide de la propriété spring.profiles.active, la valeur de jdbc.host sera récupérée. Alors quand (sous Windows)
jdbc.host prendra la valeur de jdbc-dev.properties.
pour
jdbc.host prendra la valeur de jdbc.properties.
la source
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:Pour spécifier des fichiers de propriétés externes, ces options devraient vous intéresser:
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: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 queapplication.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:
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 .spring.config.location
est maintenant un moyen de s'assurer que toutapplication.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 nouvellespring.config.additional-location
propriété au lieu despring.config.location
cela ajoute toujours les emplacements comme indiqué dans la documentation :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:
Pour y ajouter des fichiers de configuration aux emplacements par défaut:
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.la source
application.properties
avec tous les paramètres et plusieurs${file_name}.properties
avec des ensembles de propriétés partiellement définis. Donc, si vous utilisez@PropertySource
ou d'autres liens forts vers des fichiers, vous pouvez créer un autre fichier externe et remplacer ces propriétés (par exemple: à partir declasspath:file.properties
).Jetez un œil à PropertyPlaceholderConfigurer, je le trouve plus clair à utiliser que l'annotation.
par exemple
la source
c'est une approche simple utilisant la botte à ressort
TestClass.java
le contexte app.properties , à l' emplacement sélectionné
votre application Spring Boot
et le contexte prédéfini application.properties
vous pouvez écrire autant de classes de configuration que vous le souhaitez et les activer / désactiver simplement en définissant spring.profiles.active = le / les noms du profil {séparés par des virgules}
comme vous pouvez le voir, le démarrage du printemps est génial, il a juste besoin d'un certain temps pour se familiariser, il convient de mentionner que vous pouvez également utiliser @Value sur vos champs
la source
J'ai eu le même problème. Je voulais avoir la possibilité d'écraser un fichier de configuration interne au démarrage par un fichier externe, similaire à la détection Spring Boot application.properties. Dans mon cas, c'est un fichier user.properties où sont stockés les utilisateurs de mes applications.
Mes exigences:
Chargez le fichier à partir des emplacements suivants (dans cet ordre)
J'ai trouvé la solution suivante:
Maintenant, l'application utilise la ressource classpath, mais recherche également une ressource aux autres emplacements donnés. La dernière ressource existante sera sélectionnée et utilisée. Je suis capable de démarrer mon application avec java -jar myapp.jar --properties.location = / répertoire / myproperties.properties pour utiliser un emplacement de propriétés qui fait flotter mon bateau.
Un détail important ici: utilisez une chaîne vide comme valeur par défaut pour la propriété properties.location dans l'annotation @Value pour éviter les erreurs lorsque la propriété n'est pas définie.
La convention pour un properties.location est la suivante: Utilisez un répertoire ou un chemin vers un fichier de propriétés en tant que properties.location.
Si vous souhaitez remplacer uniquement des propriétés spécifiques, un PropertiesFactoryBean avec setIgnoreResourceNotFound (true) peut être utilisé avec le tableau de ressources défini comme emplacements.
Je suis sûr que cette solution peut être étendue pour gérer plusieurs fichiers ...
ÉDITER
Voici ma solution pour plusieurs fichiers :) Comme avant, cela peut être combiné avec un PropertiesFactoryBean.
la source
spring boot nous permet d'écrire différents profils à écrire pour différents environnements, par exemple, nous pouvons avoir des fichiers de propriétés séparés pour les environnements de production, qa et locaux
Le fichier application-local.properties avec des configurations en fonction de ma machine locale est
De même, nous pouvons écrire application-prod.properties et application-qa.properties autant de fichiers de propriétés que nous le voulons
puis écrivez des scripts pour démarrer l'application pour différents environnements, par exemple
la source
J'ai juste eu un problème similaire à celui-ci et j'ai finalement trouvé la cause: le fichier application.properties avait les mauvais attributs de propriété et rwx. Ainsi, lorsque tomcat a démarré, le fichier application.properties était au bon endroit, mais appartenait à un autre utilisateur:
la source
Une version modifiée de la solution @mxsb qui nous permet de définir plusieurs fichiers et dans mon cas ce sont des fichiers yml.
Dans mon application-dev.yml, j'ai ajouté cette configuration qui me permet d'injecter tous les yml contenant -dev.yml. Cela peut également être une liste de fichiers spécifiques. "classpath: /test/test.yml,classpath: /test2/test.yml"
Cela aide à obtenir une carte des propriétés.
Cependant, si comme dans mon cas, je voulais avoir à diviser les fichiers yml pour chaque profil, les charger et les injecter directement dans la configuration du ressort avant l'initialisation des beans.
... vous avez eu l'idée
Le composant est légèrement différent
}
la source
Si vous souhaitez remplacer les valeurs spécifiées dans votre fichier application.properties, vous pouvez modifier votre profil actif pendant que vous exécutez votre application et créez un fichier de propriétés d'application pour le profil. Ainsi, par exemple, spécifions le profil actif "override", puis, en supposant que vous ayez créé votre nouveau fichier de propriétés d'application appelé "application-override.properties" sous / tmp, alors vous pouvez exécuter
Les valeurs spécifiées sous spring.config.location sont évaluées dans l'ordre inverse. Ainsi, dans mon exemple, le classpat est évalué en premier, puis la valeur du fichier.
Si le fichier jar et le fichier "application-override.properties" se trouvent dans le répertoire courant, vous pouvez en fait simplement utiliser
puisque Spring Boot trouvera le fichier de propriétés pour vous
la source
J'ai trouvé que c'était un modèle utile à suivre:
Ici, nous remplaçons l'utilisation de "application.yml" pour utiliser "application-MyTest_LowerImportance.yml" et aussi "application-MyTest_MostImportant.yml"
(Spring recherchera également les fichiers .properties)
Les paramètres de débogage et de trace sont également inclus en tant que bonus supplémentaire, sur une ligne séparée afin que vous puissiez les commenter si nécessaire;]
Le débogage / trace est incroyablement utile car Spring videra les noms de tous les fichiers qu'il charge et ceux qu'il essaie de charger.
Vous verrez des lignes comme celle-ci dans la console au moment de l'exécution:
la source
J'ai rencontré beaucoup de problèmes en essayant de comprendre cela. Voici ma configuration,
Dev Env: Windows 10, Java: 1.8.0_25, Spring Boot: 2.0.3.RELEASE, Spring: 5.0.7.RELEASE
Ce que j'ai trouvé, c'est que le ressort s'en tient au concept "par défaut sensible pour la configuration". Cela se traduit par le fait que vous devez avoir tous vos fichiers de propriété dans votre fichier de guerre. Une fois là-dedans, vous pouvez les remplacer en utilisant la propriété de ligne de commande "--spring.config.additional-location" pour pointer vers des fichiers de propriétés externes. Mais cela ne fonctionnera PAS si les fichiers de propriétés ne font pas partie du fichier war d'origine.
Code démo: https://github.com/gselvara/spring-boot-property-demo/tree/master
la source