Est-il possible de saisir des arguments lors du lancement de l'application Spring-Boot (MVN Spring-Boot: run) à partir de la ligne de commande, puis de les récupérer dans main ()?
En regardant le code source du plug-in spring-boot-maven-plugin, j'ai constaté que vous deviez faire:
mvn spring-boot:run -Drun.arguments="arg1,arg2"
Un autre moyen d'obtenir plus d'informations sur les options prises en charge par l'objectif run
du plug-in spring-boot
consiste à exécuter la commande suivante:
mvn help:describe -Dcmd=spring-boot:run -Ddetail
Pour Spring Boot 2.x, la source est ici et vous devez maintenant utiliser -Dspring-boot.run.arguments="args1,args2"
Si vous utilisez Gradle et que vous souhaitez pouvoir passer des arguments de ligne de commande à la tâche Gradle bootRun
, vous devez d'abord configurer, par exemple:
bootRun {
if ( project.hasProperty('args') ) {
args project.args.split('\\s+')
}
}
et lancez la tâche avec gradle bootRun -Pargs="arg1 arg2"
Lorsque vous passez plusieurs arguments à l'aide de -Drun.arguments, si l'argument a à son tour des valeurs "séparées par des virgules", seule la première valeur de chaque argument est utilisée. Pour éviter cela, répétez l'argument autant de fois que de valeurs.
C'est plus une solution de contournement. Je ne sais pas s'il existe une alternative sauf si le délimiteur est différent - comme '|'.
Problème:
mvn spring-boot:run -Drun.arguments="--spring.profiles.active=test,dev"
Choisit uniquement le profil 'test' pour la commande ci-dessus.
Solution de contournement:
mvn spring-boot:run -Drun.arguments="--spring.profiles.active=test,--spring.profiles.active=dev"
Choisit les profils "dev" et "test" pour la commande ci-dessus.
Attention: le moyen de passer des arguments dépend de la version majeure de spring-boot
.
TLDR
Pour Spring Boot 1:
mvn spring-boot:run -Drun.arguments="argOne,argTwo"
Pour Spring Boot 2:
mvn spring-boot:run -Dspring-boot.run.arguments="argOne,argTwo"
1) La version spring-boot-maven-plugin
et la version Spring Boot
que vous utilisez doivent être alignées.
Selon la version principale de Spring Boot utilisée (1
ou 2
), le spring-boot-maven-plugin
dans la version 1
ou 2
devrait effectivement être utilisé.
Si votre pom.xml
hérite du spring-boot-starter-parent
:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>ONE_OR_TWO_VERSION</version>
</parent>
Dans votre pom, la version du plugin utilisé ne devrait même pas être spécifiée car cette dépendance du plugin est héritée:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
...
</configuration>
</plugin>
</plugins>
Si votre pom.xml
n'hérite pas de spring-boot-starter-parent
, n'oubliez pas d'aligner la version de spring-boot-maven-plugin
avec la version exacte de spring boot
que vous souhaitez utiliser.
2) Passer des arguments en ligne de commande avec spring-boot-maven-plugin: 1.X.X
Pour un argument:
mvn spring-boot:run -Drun.arguments="argOne"
pour plusieurs:
mvn spring-boot:run -Drun.arguments="argOne,argTwo"
La page du plugin maven le documente:
Name Type Since Description
arguments | String[] | 1.0 | Arguments that should be passed
to the application. On command line use
commas to separate multiple arguments.
User property is: run.arguments.
3) Passer des arguments en ligne de commande avec spring-boot-maven-plugin: 2.X.X
Pour un argument:
mvn spring-boot:run -Dspring-boot.run.arguments="argOne"
pour plusieurs:
mvn spring-boot:run -Dspring-boot.run.arguments="argOne,argTwo"
Je n'ai pas trouvé la documentation du plugin pour la version 2.X.X qui s'y réfère.
Mais la classe org.springframework.boot.maven.AbstractRunMojo
du plugin spring-boot-maven-plugin:2.0.0.M3
fait référence à cette propriété de l'utilisateur:
public abstract class AbstractRunMojo extends AbstractDependencyFilterMojo
...
@Parameter(property="spring-boot.run.arguments")
private String[] arguments;
...
protected RunArguments resolveApplicationArguments(){
RunArguments runArguments = new RunArguments(this.arguments);
addActiveProfileArgument(runArguments);
return runArguments;
}
...
}
4) Conseil: lorsque vous passez plusieurs arguments, les espaces entre virgules sont considérés.
mvn spring-boot:run -Dspring-boot.run.arguments="argOne,argTwo"
sera interprété comme ["argOne", "argTwo"]
Mais ça :
mvn spring-boot:run -Dspring-boot.run.arguments="argOne, argTwo"
sera interprété comme ["argOne", " argTwo"]
Et si vous utilisez Eclipse ...
Nom du paramètre | Valeur | | run.arguments | "--name = Adam" |
Spring Boot 1 en tant que 2 fournit un moyen de passer plusieurs profils en argument et d'éviter le problème lié à la virgule utilisée à la fois comme séparateur entre les arguments et les valeurs transmises en tant que profil actif.
Donc au lieu d'écrire:
mvn spring-boot:run -Dspring-boot.run.arguments=--spring.profiles.active=test,--spring.profiles.active=dev
utilisez la propriété Spring Boot Maven profiles
qui est un raccourci de commodité de spring.profiles.active
tel que ce qui suit:
La propriété utilisateur Maven est différente selon la version de Spring Boot.
Pour Spring Boot 1.4+, il s'agit de run.profiles
:
mvn spring-boot:run -Drun.profiles=dev,test
Pour Spring Boot 2, il s'agit de spring-boot.run.profiles
:
mvn spring-boot:run -Dspring-boot.run.profiles=dev,test
De la documentation du plugin:
profils:
Les profils de ressort à activer. Raccourci de commodité pour spécifier l'argument 'spring.profiles.active'. En ligne de commande, utilisez des virgules en séparer plusieurs profils.
Type: Java.lang.String []
Depuis: 1.3
Obligatoire: non
Propriété utilisateur: spring-boot.run.profiles
C'est ce qui a fonctionné pour moi (spring-boot v1.4.3.RELEASE
) ,.
mvn spring-boot:run -Dspring.profiles.active=test,local -Dlogback-debug=true
Pour la dernière version de spring, utilisez -Dspring-boot.run.arguments = comme dans l'exemple ci-dessous
spring-boot:run -Djasypt.encryptor.password=temp -Dspring-boot.run.arguments="OU,Grade"