web-dev-qa-db-fra.com

Récupère les arguments en ligne de commande de spring-boot: run

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 ()?

57
sandris

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"

90
geoand

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.

31

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"]

14
davidxxx

Et si vous utilisez Eclipse ...

 Nom du paramètre | Valeur | 
 | run.arguments | "--name = Adam" | 
1
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

1
davidxxx

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
0
Anand Rockzz

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"
0
Pratik Shukla