Get command-line arguments from spring-boot:run

Looking at the source code of the spring-boot-maven-plugin I found that you need to do:

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

Another way to get more information about what options the run goal of the spring-boot plugin supports is to execute the following command:

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

For Spring Boot 2.x, the source is here and you now need to use -Dspring-boot.run.arguments="args1,args2"

If you are using Gradle and you want to be able to pass command line arguments to the Gradle bootRun task, you first need to configure, for example like so:

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

and run the task using gradle bootRun -Pargs="arg1 arg2"


When passing multiple arguments using -Drun.arguments, if the argument in turn has 'comma-separated' values, then only the first value of each argument is used. To avoid this repeat the argument as many times as the number of values.

This is more of a workaround. Not sure if there is an alternative unless the delimiter is different - like '|'.

E.g Issue:

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

Picks only 'test' profile for the above command.

Workaround:

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

Picks both 'dev' & 'test' profiles for the above command.


Be aware : The way of passing arguments depends on the spring-boot major version.

TLDR

For Spring Boot 1 :

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

For Spring Boot 2 :

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

1) spring-boot-maven-plugin version and the the Spring Boot version you use has to be aligned.

According to the Spring Boot major version used (1 or 2), the spring-boot-maven-plugin in the 1 or the 2 version should indeed be used.
If your pom.xml inherits from the spring-boot-starter-parent :

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

In your pom, the version of the plugin used should not even be specified as this plugin dependency is inherited :

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

In case of your pom.xml not inheriting from spring-boot-starter-parent, don't forget to align the version of spring-boot-maven-plugin with the exact version of spring boot you want to use.

2) Passing arguments in command line with spring-boot-maven-plugin:1.X.X

For one argument :

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

for multiple :

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

The maven plugin page documents it :

  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) Passing arguments in command line with spring-boot-maven-plugin:2.X.X

For one argument :

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

for multiple :

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

I didn't find the plugin documentation for the 2.X.X version that refers to that.
But the org.springframework.boot.maven.AbstractRunMojo class of the spring-boot-maven-plugin:2.0.0.M3 plugin refers to this user property:

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) Hint : as you pass more than one argument, whitespaces between commas are considered.

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

will be interpreted as ["argOne", "argTwo"]

But this :

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

will be interpreted as ["argOne", " argTwo"]