J'ai une application Spring Boot qui s'exécutera dans divers environnements et, en fonction de l'environnement dans lequel elle s'exécute, elle se connectera à une base de données différente. J'en ai quelques uns application.properties
fichiers, un pour chaque environnement qui ressemble à ceci:
application-local.properties
:
spring.datasource.platform=postgres
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=dbuser
spring.datasource.password=123456789
application-someserver.properties
:
spring.datasource.platform=postgres
spring.datasource.url=jdbc:postgresql://someserver:5432/myproddb
spring.datasource.username=produser
spring.datasource.password=productionpass
etc.
Sur chacun de mes environnements, j'ai une variable d'environnement appelée MYENV
qui est définie sur le type d'environnement, par exemple local
ou someserver
(le nom du application-{env}.properties
fichiers correspond parfaitement au nom de l'environnement).
Comment puis-je obtenir Spring Boot pour lire cette variable d'environnement et choisir automatiquement la bonne .properties
fichier? Je ne veux pas avoir à faire tout le -Dspring.profiles.active=someserver
en raison de la façon dont ce package est déployé (il ne s'exécutera pas en tant que jar).
Comment puis-je obtenir Spring Boot pour lire cette variable d'environnement et choisir automatiquement le fichier .properties correct?
Dites à Spring Boot de sélectionner Active Profile dans la propriété ou la variable d'environnement MYENV
. Pour ce faire, vous pouvez ajouter ce qui suit dans votre application.properties
:
spring.profiles.active=${MYENV}
De cette façon, Spring Boot définira spring.profiles.active
à la valeur de la variable d'environnement MYENV
.
Je n'ai pas à faire tout le -Dspring.profiles.active = someserver à cause de la façon dont ce paquet est déployé (il ne fonctionnera pas comme un bocal)
Vous pouvez utiliser la variable d'environnement correspondante à cette spring.profiles.active
, si vous n'aimez pas passer une propriété système via -D
arguments. Cette variable d'environnement correspondante est SPRING_PROFILES_ACTIVE
. Par exemple, si vous définissez le SPRING_PROFILES_ACTIVE
à local
, le profil local
sera activé. Si vous insistez pour utiliser la variable d'environnement MYENV
, la première solution est la voie à suivre.
Si vous déployez cette application sur un conteneur (Tomcat, weblogic, ...), vous pouvez spécifier une variable d'environnement. Par exemple, permet de spécifier la variable d'environnement application1.spring.profiles.active=someserver
puis dans votre application.properties définissez la propriété spring.profiles.active=${application1.spring.profiles.active}
En utilisant Spring context 5.0, j'ai réussi à charger le bon fichier de propriétés en fonction de l'environnement système via l'annotation suivante
@PropertySources({
@PropertySource("classpath:application.properties"),
@PropertySource("classpath:application-${MYENV:test}.properties")})
Ici, la valeur MYENV est lue à partir de l'environnement système et si l'environnement système n'est pas présent, le fichier de propriétés de l'environnement de test par défaut sera chargé, si je donne une valeur MYENV incorrecte - il ne démarrera pas l'application.
Remarque: pour chaque profil, vous souhaitez maintenir, vous devez créer un fichier application- [profile] .property et bien que j'utilise le contexte Spring 5.0 et non Spring boot - je crois que cela fonctionnera également sur Spring 4.1
C'est la meilleure solution que je crois pour mon AWS Lambda - avec des dépendances minimales