Définition du profil actif et de l'emplacement de configuration à partir de la ligne de commande dans Spring Boot

167

J'ai une application de démarrage à ressort.

J'ai trois profils dans mon application -> développement, mise en scène et production . Donc j'ai 3 fichiers

  1. application-development.yml
  2. application-staging.yml
  3. application-production.yml

Mon application.yml réside à l'intérieur src/main/resources. J'ai défini le profil actif dans application.yml comme:

spring:
  profiles.active: development

Les 3 autres fichiers de configuration spécifiques au profil sont présents dans le C:\configdossier.

J'utilise le plugin gradle pour eclipse. Lorsque j'essaye de faire un " bootRun ", je règle les arguments de ligne de commande dans ma configuration gradle dans eclipse comme

 -Dspring.profiles.active=staging -Dspring.config.location=C:\Config

Cependant, la propriété de ligne de commande n'est pas reflétée et mon profil actif est toujours défini comme développement (qui est celui que j'ai mentionné dans le fichier applications.yml). De plus, le dossier C: \ Config n'est pas recherché pour les fichiers de configuration spécifiques au profil.

Je pense qu'il me manque quelque chose ici. J'essaye de le comprendre depuis 2 jours. Mais pas de chance. J'apprécierais vraiment n'importe quelle aide.

O-OF-N
la source
Pouvez-vous s'il vous plaît ajouter votre bootRunligne de commande aussi
Biju Kunjummen
Je l'exécutais depuis eclipse et non depuis la ligne de commande jusqu'à présent. Mais j'ai essayé de courir en utilisant "gradle bootRun -Dspring.config.location = C: \ Config \ -Dspring.profiles.active = staging" et j'ai obtenu le même résultat.
O-OF-N

Réponses:

347

Il existe deux façons différentes d'ajouter / remplacer les propriétés du ressort sur la ligne de commande.

Option 1: Propriétés système Java (arguments VM)

Il est important que les paramètres -D soient avant votre application.jar sinon ils ne sont pas reconnus.

java -jar -Dspring.profiles.active=prod application.jar

Option 2: arguments du programme

java -jar application.jar --spring.profiles.active = prod --spring.config.location = c: \ config
RenRen
la source
46
L'ordre des paramètres -D est vraiment important :)
martin
3
comment pouvez-vous y parvenir tout en déployant pour dire conteneur tomcat? Dans ce cas, je mets simplement ma guerre dans le dossier webapps de tomcat, comment puis-je fournir les informations de profil? en définissant les propriétés du système?
prière du
@prayagupd oui, vous pouvez avoir des propriétés système définies dans votre bash_profile.
meilleurs vœux
2
@maneesh ouais, j'utilise la variable env SPRING_PROFILES_ACTIVE exportée via ~/.bash_profile. export SPRING_PROFILES_ACTIVE=e2e
prière
1
Quand vous dites que l'ordre est important: Pouvons-nous passer les deux arguments: -Dspring.profile.active et -Dspring.config.location tels que, le profil est défini selon le premier argument et le fichier de propriété est choisi selon le deuxième args? Ex:java -Dspring.profiles.active=$ENV -Dspring.config.location=file:///aws-secrets-manager/properties/application-$ENV.properties /code/app.jar
Pramod Setlur
27

Ma meilleure pratique consiste à définir cela comme un argument VM "-D". Veuillez noter les différences entre la botte à ressort 1.x et 2.x.

Les profils à activer peuvent être spécifiés sur la ligne de commande:

Spring-Boot 2.x

-Dspring-boot.run.profiles=local

Spring-Boot 1.x

-Dspring.profiles.active=local

exemple d'utilisation avec maven:

Spring-Boot 2.x

mvn spring-boot:run -Dspring-boot.run.profiles=local

Spring-Boot 1.x

mvn spring-boot:run -Dspring.profiles.active=local

Assurez-vous de les séparer par une virgule pour plusieurs profils:

mvn spring-boot:run -Dspring.profiles.active=local,foo,bar
mvn spring-boot:run -Dspring-boot.run.profiles=local,foo,bar
Sma Ma
la source
Vous voulez dire printemps / printemps-boot? (Spring 1x et Spring 2x)!
smilyface
1
botte à ressort @smilyface. spring boot est également disponible en différentes versions: mvnrepository.com/artifact/org.springframework.boot/spring-boot
Sma Ma
2
J'utilise spring-boot 2.1.3, et -Dspring-boot.run.profiles=localn'a pas fonctionné, a -Dspring.profiles.active=localfonctionné.
Donghua Liu
spring-boot 2.2.0: fonctionne à la fois: -Dspring-boot.run.profileset-Dspring.profiles.active
Grigory Kislin le
18

J'ai dû ajouter ceci:

bootRun {
    String activeProfile =  System.properties['spring.profiles.active']
    String confLoc = System.properties['spring.config.location']
    systemProperty "spring.profiles.active", activeProfile
    systemProperty "spring.config.location", "file:$confLoc"
}

Et maintenant, bootRun récupère le profil et les emplacements de configuration.

Merci beaucoup @jst pour le pointeur.

O-OF-N
la source
7
Cela peut être encore plus simple comme suit: bootRun { systemProperties = System.properties }. Cette commande copiera tous les paramètres passés avec le -Dcommutateur avec les mêmes clés à systemPropertymapper.
edufinn
cela semble être une solution graduelle, n'y a-t-il pas de solution générique?
user1767316
1
Où ajoutez-vous exactement cela? N'importe où dans le fichier build.gradle ou à un emplacement spécifique du fichier?
Scala Enthusiast
16
-Dspring.profiles.active=staging -Dspring.config.location=C:\Config

n'est pas correcte.

devrait être:

--spring.profiles.active=staging --spring.config.location=C:\Config
Michael Yin
la source
3
Cela provoque l'erreur "Option non reconnue: --spring.config.location"
James Watkins
-D est la manière correcte de définir les propriétés du système Java. --quelque chose est un paramètre bash.
Xdg
--spring.profiles.active travaille pour moi, même chose que j'ai référée de docs.spring.io/spring-boot/docs/current/reference/html/…
Pushkar
Cela fonctionne également pour moi lorsque j'utilise Exécuter en tant que -> Application Java dans Eclipse
Olivier Boissé
11
en fait, les DEUX sont corrects, cela dépend de la façon dont il est utilisé: cela peut être java -Dspring.profiles.active=staging -Dspring.config.location=C:\Config your-spring-boot-app.jarOUjava your-spring-boot.jar --spring.profiles.active=staging --spring.config.location=C:\Config
Dexter Legaspi
9

vous pouvez utiliser la ligne de commande suivante:

java -jar -Dspring.profiles.active=[yourProfileName] target/[yourJar].jar
Rollen Holt
la source
9

Il existe un autre moyen en définissant la variable OS , SPRING_PROFILES_ACTIVE .

par exemple:

SPRING_PROFILES_ACTIVE=dev gradle clean bootRun

Référence: Comment définir les profils Spring actifs

Rothin Sen
la source
Oui, et cela évite d'avoir à se soucier de la façon dont Gradle transmet les propriétés du système à l'application.
ben3000
C'est la bonne manière. Il doit également être utilisé pour définir les utilisateurs et les mots de passe de la base de données et d'autres configurations sensibles afin qu'ils ne soient pas vérifiés dans le contrôle de version.
Igor Donin
7

Lors de la configuration du profil via le plugin Maven, vous devez le faire viarun.jvmArguments

mvn spring-boot:run -Drun.jvmArguments="-Dspring.profiles.active=production"

Avec l'option de débogage:

mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -Dspring.profiles.active=jpa"

J'ai vu beaucoup de gens monter ce voyage ... j'espère que ça aide

JARC
la source
1
a changé en mvn spring-boot:run -Dspring-boot.run.profiles=foo,bar, voir: docs.spring.io/spring-boot/docs/current/maven-plugin/examples/…
rwenz3l
@ rwenz3l Merci! qui fonctionne pour moi, vient de mettre à niveau un projet de Spring Boot 1 à 2. Maintenant, je viens de les ajouter tous dans mon bashrc ... springmvn="mvn clean spring-boot:run -Dspring.profiles.active=local -Dspring-boot.run.profiles=local"
John Smith
5

Je pense que votre problème est probablement lié au fait que votre spring.config.location ne termine pas le chemin par "/".

Citer les documents

Si spring.config.location contient des répertoires (par opposition aux fichiers), ils doivent se terminer par / (et seront ajoutés avec les noms générés à partir de spring.config.name avant d'être chargés).

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-application-property-files

jst
la source
Je vous remercie de le faire remarquer. Cependant, lorsque j'exécute -Dspring.profiles.active = staging -Dspring.config.location = C: \ Config \ me pose également le même problème. Même le profil actif n'est pas reflété. Je pense que pour une raison quelconque, ma ligne de commande ne passe pas.
O-OF-N
1
Vous devez suivre les conseils donnés dans cette question pour transmettre les arguments à bootRun stackoverflow.com/questions/25079244
...
Je vous remercie. Cela a vraiment aidé.
O-OF-N
4

La réponse de Michael Yin est correcte mais une meilleure explication semble s'imposer!

Beaucoup d'entre vous ont mentionné que -Dc'était la bonne façon de spécifier les paramètres JVM et vous avez absolument raison. Mais Michael a également raison, comme mentionné dans la documentation de Spring Boot Profiles .

Ce qui n'est pas clair dans la documentation, c'est de quel type de paramètre il s'agit: ce --spring.profiles.activen'est pas un paramètre JVM standard donc si vous voulez l'utiliser dans votre IDE remplissez les champs corrects (c'est-à-dire les arguments du programme)

Eric Taix
la source
0

Si vous utilisez Gradle:

-Pspring.profiles.active=local
FredFlinstone
la source