Holen Sie sich Befehlszeilenargumente von spring-boot: run

68

Gibt es eine Möglichkeit, Argumente einzugeben, wenn Sie die Spring-Boot-Anwendung (mvn spring-boot: run) über die Befehlszeile starten und sie dann in main () abrufen?

Sandris
quelle

Antworten:

99

Beim Betrachten des Quellcodes des Spring-Boot-Maven-Plugins stellte ich fest, dass Sie Folgendes tun müssen:

mvn spring-boot:run -Drun.arguments="arg1,arg2"

Eine andere Möglichkeit, weitere Informationen darüber zu erhalten, welche Optionen rundas spring-bootPlugin unterstützt, besteht darin, den folgenden Befehl auszuführen:

mvn help:describe -Dcmd=spring-boot:run -Ddetail

Für Spring Boot 2.x ist die Quelle hier und Sie müssen sie jetzt verwenden-Dspring-boot.run.arguments="args1,args2"

Wenn Sie Gradle verwenden und Befehlszeilenargumente an die Gradle- bootRunAufgabe übergeben möchten, müssen Sie zunächst Folgendes konfigurieren:

bootRun {
    if ( project.hasProperty('args') ) {
        args project.args.split('\\s+')
    }
}

und führen Sie die Aufgabe mit aus gradle bootRun -Pargs="arg1 arg2"

geoand
quelle
Vielen Dank. +1 für deine Antwort.
sukrit007
@ sukrit007 Ich bin froh, dass es dir geholfen hat!
Geo und
Ziemlich dumm von ihnen, Kommas über den Standardfeldern zu akzeptieren. RTFM Spring: docs.oracle.com/javase/tutorial/essential/environment/…
Ravindranath Akila
1
Mit Gradle 3.3 hat die folgende Modifikation für mich funktioniert: bootRun { // Usage: gradle bootRun -Pargs="arg1 arg2" if ( project.hasProperty('args') ) { args = (project.args.split("\\s+") as List) } }
Farrukh Najmi
3
Ab Spring Boot 2 sollten Sie-Dspring-boot.run.arguments=
mapm
38

Wenn beim Übergeben mehrerer Argumente mit -Drun.arguments das Argument wiederum durch Kommas getrennte Werte aufweist, wird nur der erste Wert jedes Arguments verwendet. Um dies zu vermeiden, wiederholen Sie das Argument so oft wie die Anzahl der Werte.

Dies ist eher eine Problemumgehung. Ich bin mir nicht sicher, ob es eine Alternative gibt, es sei denn, das Trennzeichen ist anders - wie '|'.

ZB Ausgabe:

mvn spring-boot:run -Drun.arguments="--spring.profiles.active=test,dev"

Wählt nur das Testprofil für den obigen Befehl aus.

Problemumgehung:

mvn spring-boot:run -Drun.arguments="--spring.profiles.active=test,--spring.profiles.active=dev"

Wählt sowohl 'dev' als auch 'test' Profile für den obigen Befehl aus.

Jebuselwyn Martin
quelle
Ab Spring Boot 2 sollten Sie-Dspring-boot.run.arguments=
mapm
21

Beachten Sie: Die Art und Weise der Übergabe von Argumenten hängt von der spring-bootHauptversion ab.

TLDR

Für Spring Boot 1:

mvn spring-boot:run -Drun.arguments="argOne,argTwo"

Für Spring Boot 2:

mvn spring-boot:run -Dspring-boot.run.arguments="argOne,argTwo"

1) spring-boot-maven-pluginVersion und die von Spring BootIhnen verwendete Version müssen ausgerichtet sein.

Entsprechend der verwendeten Spring Boot-Hauptversion ( 1oder 2) sollte tatsächlich die spring-boot-maven-pluginin der 1 oder der 2Version verwendet werden.
Wenn Ihr pom.xmlErbe von spring-boot-starter-parent:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>ONE_OR_TWO_VERSION</version>
</parent>

In Ihrem POM sollte die Version des verwendeten Plugins nicht einmal angegeben werden, da diese Plugin-Abhängigkeit vererbt wird:

<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>                   
        <configuration>
           ...
        </configuration>
    </plugin>
</plugins>

Wenn Sie pom.xmlnicht erben von spring-boot-starter-parent, vergessen Sie nicht, die Version von spring-boot-maven-pluginan der genauen Version auszurichten, die spring bootSie verwenden möchten.

2) Übergeben von Argumenten in der Befehlszeile mit dem Spring-Boot-Maven-Plugin: 1.XX.

Für ein Argument:

mvn spring-boot:run -Drun.arguments="argOne"

für mehrere:

mvn spring-boot:run -Drun.arguments="argOne,argTwo"

Die Maven Plugin Seite dokumentiert es:

  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) Übergeben von Argumenten in der Befehlszeile mit dem Spring-Boot-Maven-Plugin: 2.XX.

Für ein Argument:

mvn spring-boot:run -Dspring-boot.run.arguments="argOne"

für mehrere:

mvn spring-boot:run -Dspring-boot.run.arguments="argOne,argTwo"

Ich habe die Plugin-Dokumentation für die 2.XX-Version, die darauf verweist, nicht gefunden.
Die org.springframework.boot.maven.AbstractRunMojoKlasse des spring-boot-maven-plugin:2.0.0.M3Plugins bezieht sich jedoch auf diese Benutzereigenschaft:

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) Hinweis: Wenn Sie mehr als ein Argument übergeben, werden Leerzeichen zwischen Kommas berücksichtigt.

mvn spring-boot:run -Dspring-boot.run.arguments="argOne,argTwo"

wird interpretiert als ["argOne", "argTwo"]

Aber dieses :

mvn spring-boot:run -Dspring-boot.run.arguments="argOne, argTwo"

wird interpretiert als ["argOne", " argTwo"]

davidxxx
quelle
Wie geben Sie Argumente im configurationAbschnitt pom.xml des Plugins an? Ich habe es versucht, <arguments><argument>-Dprop=value</argument></arguments>aber der Eigenschaftswert wird auf diese Weise nicht erfasst.
user1902183
@ user1902183 use<arguments><argument>--prop=value</argument></arguments>
splash
3

Spring Boot 1 als 2 bietet eine Möglichkeit, mehrere Profile als Argument zu übergeben und das Problem im Zusammenhang mit dem Komma zu vermeiden, das sowohl als Trennzeichen zwischen den Argumenten als auch den als aktives Profil übergebenen Werten verwendet wird.

Also anstatt zu schreiben:

mvn spring-boot:run -Dspring-boot.run.arguments=--spring.profiles.active=test,--spring.profiles.active=dev

Verwenden Sie die Spring Boot Maven- profilesEigenschaft , die eine praktische Verknüpfung spring.profiles.activewie die folgenden darstellt:

Die Maven-Benutzereigenschaft unterscheidet sich je nach Spring Boot-Version.

Für Spring Boot 1.4+ bedeutet dies run.profiles:

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

Für Spring Boot 2 bedeutet dies spring-boot.run.profiles:

mvn spring-boot:run -Dspring-boot.run.profiles=dev,test

Aus der Plugin-Dokumentation:

Profile :

Die zu aktivierenden Federprofile. Praktische Verknüpfung zum Angeben des Arguments 'spring.profiles.active'. Verwenden Sie in der Befehlszeile Kommas, um mehrere Profile zu trennen.

Geben Sie Folgendes ein: java.lang.String []

Seit: 1.3

Erforderlich: Nein

Benutzereigenschaft: spring-boot.run.profiles

davidxxx
quelle
2

Wie ich heute überprüft habe, lautet die korrekte Verwendung für Spring Boot 2.2.5:

mvn spring-boot:run -Dspring-boot.run.arguments="--arg1=value --arg2=value"

Weil die Hilfe sagt:

commandlineArguments
  User property: spring-boot.run.arguments
  Arguments from the command line that should be passed to the application.
  Use spaces to separate multiple arguments and make sure to wrap multiple
  values between quotes. When specified, takes precedence over arguments.
user3157855
quelle
1

Und wenn Sie Eclipse verwenden ...

| Parametername | Wert |
| run.arguments | "--name = Adam" |
aakoch
quelle
0

Das hat bei mir funktioniert ( spring-boot v1.4.3.RELEASE).

mvn spring-boot:run -Dspring.profiles.active=test,local -Dlogback-debug=true
Anand Rockzz
quelle
0

Verwenden Sie für die neueste Version von spring -Dspring-boot.run.arguments = wie im folgenden Beispiel gezeigt

spring-boot:run -Djasypt.encryptor.password=temp -Dspring-boot.run.arguments="OU,Grade"
Pratik Shukla
quelle