Comment activer un profil Spring Boot lors de l'exécution à partir d'IntelliJ?

133

J'ai 5 environnements:

 - local (my development machine)
 - dev
 - qc
 - uat
 - live
 - staging

Je souhaite que différentes propriétés d'application soient utilisées pour chaque environnement, j'ai donc les fichiers de propriétés suivants, chacun ayant une URL différente pour la source de données:

 - application.properties  (containing common properties)
 - application-local.properties
 - application-dev.properties
 - application-qc.properties
 - application-uat.properties
 - application-live.properties

J'utilise IntelliJ et j'exécute mon application en utilisant bootRun dans le plugin Gradle sur ma machine locale. J'utiliserai le déploiement du même fichier war d'application sur tous les autres environnements qui exécutent Tomcat.

J'ai essayé d'ajouter:

--spring.profiles.active = local

à la configuration d'exécution sous les paramètres de script.

J'ai essayé d'ajouter

-Dspring.profiles.active = local

à la configuration d'exécution sous les options de VM.

Aucun travail. Je continue de voir le message INFO au démarrage dire: Aucun profil actif défini, retour aux profils par défaut: par défaut

Si j'exécute mon application à partir de la ligne de commande Windows en utilisant

gradle bootRun

mais j'ai d'abord défini la variable d'environnement

set SPRING_PROFILES_ACTIVE=local

Ensuite, tout fonctionne.

Ma question est donc la suivante: comment activer mon profil Spring Boot local lors de l'exécution de bootRun depuis IntelliJ?

Dleerob
la source
1
Pourquoi exécutez-vous l'application via gradle là-bas? Ne serait-il pas 10 fois plus pratique d'utiliser la configuration d'exécution? Il y a un champ où vous pouvez définir les profils pour activer ...
Stephane Nicoll
J'utilise la configuration d'exécution dans IntelliJ, comme expliqué ci-dessus. Ça ne fonctionne pas.
dleerob du
2
Non tu ne l'es pas. Ce dont je parle, c'est la "configuration d'exécution de Spring Boot" Exécuter -> Modifier la configuration> Nouveau> Spring Boot.
Stephane Nicoll
Aah oui, je me suis éloigné de la configuration d'exécution de Spring Boot car je devais développer project.properties dans application.properties dans mon build.gradle et si j'utilisais la configuration d'exécution de Spring Boot, cela ne semblait pas fonctionner. Je vais chercher à résoudre ce problème et peut-être puis-je simplement utiliser le champ de profil actif comme vous l'avez suggéré
dleerob
1
L'utilisation de la configuration Spring Boot semble plus problématique que sa valeur. Le 'Make' copie simplement les ressources et ne les filtre / ne les modifie pas selon le script de construction. Puis lui dire d'exécuter le 'build' à partir de gradle au lieu de 'make' provoque simplement le gel de l'exécution. Si j'utilise bootRun à la place, avec mon entrée d'environnement selon la réponse ci-dessous, tout fonctionne bien.
dleerob le

Réponses:

194

J'ai ajouté -Dspring.profiles.active=testà VM Options, puis relancé cette configuration. Cela a parfaitement fonctionné.

Cela peut être défini par

  • Choisir Run | Edit Configurations...
  • Aller à l' Configurationonglet
  • Développez la Environmentsection pour révélerVM options
Thom
la source
J'étais coincé dans la même situation mais pour un projet Maven. Merci pour l'aide. Nous avons défini l'option VM pour chaque fichier de test.
Sri9911
2
Cela ne fonctionne pas pour moi aussi. J'utilise gradle et deux modules (api et ui)
Virkom
1
Cela ne fonctionne pas non plus pour moi, en utilisant également gradle ici.
IARI
Salut, j'ai le même problème mais ce correctif ne résout pas le problème. qu'entend-on ici par réexaminer la configuration? est-ce aussi juste que de réexécuter la tâche?
user1456110
J'ai exécuté ce test en particulier après l'avoir modifié comme indiqué.
Thom
82

Si vous utilisez réellement des configurations d'exécution de démarrage à ressort (actuellement uniquement prises en charge dans l'édition Ultimate), il est facile de préconfigurer les profils dans le paramètre «Profils actifs».

entrez la description de l'image ici

Daniel Bubenheim
la source
1
Merci, je suis sûr que cela fonctionnerait, mais je n'utilise pas la configuration d'exécution Spring Boot, j'utilise la configuration d'exécution Gradle qui n'a pas le champ «Profils actifs». Ma compilation gradle filtre et modifie certains des fichiers de propriétés qu'elle copie dans le répertoire de construction, j'utilise donc la configuration d'exécution Grade pour cela.
dleerob
Comme une réponse ci-dessus l'a souligné: si cela ne fonctionne pas pour vous, assurez-vous que vous passez argsdans votre Application.main()exSpringApplication.run( Application.class, args );
Xaero Degreaz
Cette fonctionnalité est uniquement prise en charge dans l'édition Ultimate.
Julien Malige
Merci @JulienMalige pour l'avoir signalé. Je modifierai ma réponse.
Daniel Bubenheim
11

Essayez d'ajouter cette commande dans votre build.gradle

entrez la description de l'image ici

Donc, pour exécuter, configurez cette forme:

entrez la description de l'image ici

Emerson Moura
la source
9

Spring Boot semble avoir changé la façon de lire les options de la VM au fur et à mesure de son évolution. Voici un moyen d'essayer lorsque vous lancez une application dans Intellij et que vous souhaitez activer un profil:

1. Modifier les options de la VM

Ouvrez «Modifier la configuration» dans «Exécuter», et dans «Options VM», ajoutez: -Dspring.profiles.active=local

Cela fonctionne en fait avec un de mes projets avec Spring Boot v2.0.3.RELEASEet Spring v5.0.7.RELEASE, mais pas avec un autre projet avec Spring Boot v2.1.1.RELEASEet Spring v5.1.3.RELEASE.

De plus, lors de l'exécution avec Maven ou JAR, les gens ont mentionné ceci:

mvn spring-boot:run -Drun.profiles=dev

ou

java -jar -Dspring.profiles.active=dev XXX.jar

(Voir ici: comment utiliser les profils Spring Boot )

2. Transmission des arguments JVM

Il est mentionné quelque part, que Spring change la façon de lancer le processus des applications si vous spécifiez certaines options JVM; il crée un autre processus et ne transmettra pas l'argument qu'il a reçu, donc cela ne fonctionne pas. La seule façon de lui passer des arguments est:

mvn spring-boot:run -Dspring-boot.run.jvmArguments="..."

Encore une fois, c'est pour Maven. https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/run-debug.html

3. Réglage (application) env var

Ce qui fonctionne pour moi pour le deuxième projet, c'est de définir la variable d'environnement, comme mentionné dans une réponse ci-dessus: "Modifier la configuration" - "Variable d'environnement", et:

SPRING_PROFILES_ACTIVE=local
WesternGun
la source
1
L'env var devrait en fait être SPRING_PROFILES_ACTIVE.
Josh M.
Je l'ai ajouté dans "Exécuter la configuration" d'IDEA "VM options" comme "spring.profiles.active" et cela fonctionne. Peut-être qu'une autre forme comme urs est utilisée à l'échelle du système dans les propriétés système?
WesternGun
Si vous l'ajoutez à ~/.profileou similaire, vous devez utiliser SPRING_PROFILES_ACTIVE- spring.profiles.activene fonctionne probablement que comme argument sur la ligne de commande.
Josh M.
1
Ah .. donc vous voulez dire la même chose que je soupçonnais; système réel env pas seulement l'application env. OK, je fais une modification.
WesternGun
8

J'ai fini par ajouter ce qui suit à mon build.gradle:

bootRun {
  environment SPRING_PROFILES_ACTIVE: environment.SPRING_PROFILES_ACTIVE ?: "local"
}

test {
  environment SPRING_PROFILES_ACTIVE: environment.SPRING_PROFILES_ACTIVE ?: "test"
}

Alors maintenant, lors de l'exécution de bootRun à partir d'IntelliJ, il utilise par défaut le profil "local".

Sur nos autres environnements, nous allons simplement définir la variable d'environnement 'SPRING_PROFILES_ACTIVE' dans Tomcat.

Je l'ai obtenu à partir d'un commentaire trouvé ici: https://github.com/spring-projects/spring-boot/pull/592

Dleerob
la source
6

Une cause probable peut être que vous ne transmettez pas les paramètres de ligne de commande à la méthode principale des applications. J'ai fait la même erreur il y a quelques semaines.

public static final void main(String... args) {
    SpringApplication.run(Application.class, args);
}
Hubert Ströbitzer
la source
Merci pour la réponse et la suggestion, mais je transmets les arguments.
dleerob
Cela a en fait résolu mon problème. Pour une raison quelconque, lorsque j'ai créé le projet à l'aide de Gradle, il n'a pas généré automatiquement ma Applicationclasse, alors je l' ai fait à la main à partir de la mémoire. argsJ'ai manqué l' étape, et donc la boîte "Profils actifs" dans la configuration d'exécution n'a pas fonctionné - j'ai dû passer manuellement -Dspring.profiles.activedans la boîte d'options VM.
Xaero Degreaz
3

J'utilise Intellij Community Edition. Allez dans "Configurations Exécuter / Déboguer"> onglet Runner> Variables d'environnement> cliquez sur le bouton "...". Ajouter: SPRING_PROFILES_ACTIVE = local

spring.profiles.active

Ryan Wibawa
la source
3

Pour Spring Boot 2.1.0 et versions ultérieures, vous pouvez utiliser

mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar

Monsieur K.
la source
2
Dans votre ligne de commande seraspring-boot:run -Dspring-boot.run.profiles=local
M. K.
avec spring-boot: exécutez ceci est la réponse
kakabali
2

Dans mon cas, j'ai utilisé la configuration ci-dessous dans les options de la VM dans IntelliJ, il ne sélectionnait pas les configurations locales, mais après un redémarrage, IntelliJil a choisi les détails de configuration IntelliJet le service a commencé à fonctionner.

-Dspring.profiles.active=local
user2293536
la source
0

Essaye ça. Modifiez votre fichier build.gradle comme suit.

ext { profile = project.hasProperty('profile') ? project['profile'] : 'local' }
sudoz
la source
0

Remplacez votre nom de profil par BE

Vous pouvez essayer la méthode ci-dessus pour activer un profil

Amrit Malla
la source
-3

Défini -Dspring.profiles.active=localsous les arguments du programme.

jwenting
la source
J'ai supprimé les citations de ma question ci-dessus. Je n'utilise pas réellement de guillemets, j'essayais juste de montrer exactement ce que je mettais dans les champs de configuration d'exécution
dleerob
5
vous voulez dire des options VM!
Michail Michailidis
Cette réponse est très trompeuse car les arguments du programme ne seront pas reconnus par l'application!
yuranos
Cette réponse ne fonctionnera pas, comme mentionné par d'autres personnes, elle devrait être sous Options VM dans IntelliJ Idea et non dans les arguments du programme
abstractKarshit