web-dev-qa-db-fra.com

Définissez Spring Boot application.properties en fonction de la variable d'environnement

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).

12
Tanishq dubey

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.

15
Ali Dehghani

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}

0
bilak

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

0