Mon application Spring Boot a ci-dessous les fichiers de propriétés.
src/main/resources/config/DEV/env.properties
mail.server=dev.mail.domain
src/main/resources/config/QA/env.properties
mail.server=qa.mail.domain
src/main/resources/config/common/env.properties
mail.url=${mail.server}/endpoint
Est-il possible de charger "common / env.properties" afin que ses espaces réservés soient résolus en utilisant le fichier de propriétés spécifique à l'environnement donné. Pour l'environnement DEV, nous voulons que les espaces réservés dans "common / env.properties" soient résolus à l'aide des valeurs de "DEV / env.properties".
Il y a des réponses sur la façon de charger plusieurs fichiers de propriétés et en fonction du profil chargement mais impossible de trouver une réponse pour ce cas d'utilisation particulier.
Merci d'avance.
3 Réponses :
Vous pouvez y parvenir en déclarant une propriété source sur une configuration de classe et en définissant une variable d'environnement dans le chemin:
@PropertySources({
@PropertySource("classpath:config/${env}/env.properties"),
@PropertySource("classpath:config/common/env.properties")
})
public class config{}
Et puis vous lancez l'application spring boot avec la variable de ligne de commande -env=dev
UPDATE[
Vous pouvez utiliser l'annotation @PropertySources pour charger plusieurs propriétés.
@PropertySource({ "classpath:config/${env}/env.properties" })
@Configuration
public class config{}
Merci. Comment /common/env.properties sera-t-il chargé? Nous aurions besoin de /common/env.properties et de {env} /env.properties chargés.
Veuillez voir ma mise à jour dans la réponse. Vous pouvez charger plusieurs propriétés en utilisant l'annotation @PropertySources . Vous pouvez donc charger à la fois /common/env.properties et {env} /env.properties en même temps. Si cela a été utile, merci de marquer la réponse comme réponse.
Merci, si nous chargeons de cette façon, les espaces réservés dans /common/env.properties seront-ils résolus avec les valeurs de {env} /env.properties?
comme il n'y a pas d'espace réservé dans ce chemin /common/env.properties, il n'y a pas de résolution.
Pas dans le chemin, mais il y a des espaces réservés dans le contenu de /common/env.properties. Par exemple; mail.url = $ {mail.server} / endpoint. Nous avons besoin que $ {mail.server} soit résolu avec la valeur du contenu de {env} /env.properties. /DEV/env.properties contient mail.server = dev.mail.domain
2 Options:
common / application.properties en utilisant configuration-maven-plugin et filtrez les fichiers pour chaque environnement. Il est désormais obsolète. application- .properties pour chaque environnement et transmettez -Dspring.profiles.active= comme option VM au démarrage de l'application. Spring prendra automatiquement la propriété du fichier correct. Dans l'option 2, vous écraserez tout ce qui est présent dans application.properties par application-.properties. Vous n'avez donc pas à ajouter uniquement les propriétés que vous devez modifier par environnement.
par exemple:
Votre application.properties peut avoir p >
@Configuration
@PropertySource("classpath:config.properties")
@PropertySource(value = "classpath:config-${spring.profiles.active}.properties", ignoreResourceNotFound = true)
Votre application-dev.properties peut avoir
logging.level.root=WARN logging.level.org.apache=WARN logging.level.org.springframework=DEBUG
ce qui signifie, lorsque vous démarrez l'application en utilisant le profil dev , le printemps prend
logging.level.org.springframework=DEBUG
edit:
De plus, vous pouvez essayer quelque chose comme ci-dessous sur votre classe. (Spring remplacera la valeur dans config.properties par les valeurs de config-dev.properties). ignoreResourceNotFound s'assurera que l'application démarrera toujours avec les valeurs par défaut même si le fichier correspondant n'est pas trouvé.
logging.level.root=WARN logging.level.org.apache=WARN logging.level.org.springframework=WARN
Merci. Je vais essayer ceci et mettre à jour. Vérification par curiosité, existe-t-il un moyen d'utiliser /common/env.properties au lieu de application.properties pour stocker les valeurs par défaut.
Vous pouvez ajouter les fichiers env.properties au chemin de classe. Vérifiez ceci: stackoverflow.com/questions/44499306/...
Vous pouvez ajouter un fichier resources / application.yml dans lequel vous pouvez avoir plusieurs profils dans un seul fichier. MultiProfile Yaml Par exemple, il existe deux profils différents 'dev' et 'qa' avec des noms d'application différents 'DEV' et 'QA' et un defaultName 'Default'
spring:
application:
name: Default
profiles:
active: qa
---
spring:
profiles: dev
application:
name: DEV
---
spring:
profiles: qa
application:
name: QA
C'est exactement à cela que servent
application.propertieset le système de profils.