web-dev-qa-db-fra.com

Comment définir le profil Spring à partir d'une variable système?

J'ai un projet Spring qui utilise un autre projet. Chaque projet a son propre profil de ressort initialisé à partir de code Java en utilisant applicationContext.xml et *.properties pour chaque profil. J'injecte le profil de args[]. Le problème est que le second projet utilise la configuration par défaut pour env du applicationContext.xml Je ne peux pas injecter le env de args[] au deuxième projet et j’ai cherché un article qui expliquerait le fonctionnement du profil Spring.

  1. Existe-t-il une hiérarchie dans laquelle le profil sera examiné lorsque la valeur par défaut n'est pas configurée à applicationContext.xml?
  2. System var est-il plus puissant que la configuration applicationContext.xml?
  3. Qu'est-ce que tu penses être la meilleure solution à mon défi?

Des articles sur ce sujet ou même des exemples seraient les plus appréciés !! Merci d'avance. 

30
user2656851

SPRING_PROFILES_ACTIVE est la variable d'environnement à remplacer/sélectionner le profil de ressort

51
Lalit Jha

Si vous fournissez le profil Spring à votre machine virtuelle Java, il ne devrait y avoir aucun problème:

Java -Dspring.profiles.active=development -jar yourApplication.jar 

Voir aussi Spring-Documentation:

http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html

69.5 Définir les profils de ressort actifs

L'environnement Spring a une API pour cela, mais normalement vous devez définir une propriété système (spring.profiles.active) ou un environnement de système d'exploitation variable (SPRING_PROFILES_ACTIVE). Par exemple. lancez votre application avec un -D argument (n'oubliez pas de le placer avant l'archive principale de la classe ou du fichier jar):

$ Java -jar -Dspring.profiles.active = production demo-0.0.1-SNAPSHOT.jar

Dans Spring Boot, vous pouvez également définir le profil actif dans application.properties, par exemple.

spring.profiles.active = production

Une valeur définie de cette manière est remplacée par la propriété ou l'environnement du système paramètre variable, mais pas par SpringApplicationBuilder.profiles () méthode. Ainsi, cette dernière API Java peut être utilisée pour augmenter les profils sans changer les valeurs par défaut.

Voir le chapitre 25, Profils dans la section "Fonctionnalités de démarrage du printemps" pour Plus d'information.

32
JanTheGun

Je configure normalement le contexte d'application en utilisant configuration basée sur les annotations plutôt que configuration basée sur XML. Quoi qu'il en soit, je pense que les deux ont le même priorité.

* Répondant à votre question, la variable système a une priorité plus élevée *


Obtenir des beans basés sur un profil depuis applicationContext

  • Utiliser @Profile sur un haricot

    @Component
    @Profile("dev")
    public class DatasourceConfigForDev
    

    Maintenant, le profil est dev

    Remarque: si le profil est donné comme @Profile("!dev"), le profil exclura dev et s'appliquera à tous les autres.

  • Utiliser l'attribut profiles en XML

    <beans profile="dev">
      <bean id="DatasourceConfigForDev" class="org.skoolguy.profiles.DatasourceConfigForDev"/>
    </beans>
    

Définissez la valeur pour le profil:

  • Par programme via l'interface WebApplicationInitializer

    Dans les applications Web, WebApplicationInitializer peut être utilisé pour configurer le ServletContext par programme.

    @Configuration
    public class MyWebApplicationInitializer implements WebApplicationInitializer {
    
      @Override
      public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.setInitParameter("spring.profiles.active", "dev");
      }
    }
    
  • Par programme via ConfigurableEnvironment

    Vous pouvez également définir des profils directement sur l'environnement:

    @Autowired
    private ConfigurableEnvironment env;
    
    ...
    
    env.setActiveProfiles("dev");
    
  • Paramètre de contexte dans web.xml

    les profils peuvent également être activés dans le fichier web.xml de l'application Web, à l'aide d'un paramètre de contexte:

    <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/app-config.xml</param-value>
    </context-param>
    <context-param>
      <param-name>spring.profiles.active</param-name>
      <param-value>dev</param-value>
    </context-param>
    
  • Paramètre système JVM

    Les noms de profil passés en tant que paramètre seront activés lors du démarrage de l'application:

    -Dspring.profiles.active=dev
    

    Dans les IDE, vous pouvez définir les variables d'environnement et les valeurs à utiliser lors de l'exécution d'une application. Voici la configuration d'exécution dans Eclipse:

 Eclipse Run Configuration - screenshot is unavailable

  • Variable d'environnement

    définir via la ligne de commande: export spring_profiles_active=dev

Tout bean qui ne spécifie pas de profil appartient au profil «par défaut».


L'ordre de priorité est:

  1. Paramètre de contexte dans web.xml 
  2. WebApplicationInitializer 
  3. Paramètre système JVM 
  4. Variable d'environnement
11
Ajmal V Aliyar

Ma solution consiste à définir la variable d'environnement sur spring.profiles.active=development. Ainsi, toutes les applications en cours d'exécution sur cette machine référenceront la variable et lanceront l'application. L'ordre dans lequel le printemps charge une propriété comme suit

application.properties
system properties
environment variable
1
Achaius

Si je lance la ligne de commande: Java -Dspring.profiles.active=development -jar yourApplication.jar à partir de mon répertoire webapplication, il est indiqué que le chemin est incorrect. Donc, je viens de définir le profil manuellement dans le fichier application.properties comme ceci: 

spring.profiles.active=mysql 

ou 

spring.profiles.active=postgres

ou 

spring.profiles.active=mongodb
1
georges van

Si vous utilisez docker pour déployer l'application Spring Boot, vous pouvez définir profile à l'aide de l'indicateur e :

docker run -e "SPRING_PROFILES_ACTIVE = prod" -p 8080: 8080 -t r.test.co/myapp:latest

1
db80