Get command-line arguments from spring-boot:run

86,380

Solution 1

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"

(edit from april 2021) For Spring Boot 2.2+, 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"

Solution 2

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.

Solution 3

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

TLDR

For Spring Boot 1:

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

For Spring Boot 2.0 and 2.1:

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

(edit from april 2021) For Spring boot 2.2 and later:

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.

  1. 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.
  1. 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;
   }
   ...
 }
  1. 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"]

(edit from march 2021)

Whitespaces are now used as separator for multiple-arguments commands, see the relevant issue.

Solution 4

As I checked today, the correct usage for Spring Boot 2.2.5 is:

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

Because help says:

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.

Solution 5

Spring Boot 1 as 2 provide a way to pass multiple profiles as argument and avoid the issue related to the comma used both as separator between the args and the values passed as active profile.

So instead of writing :

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

use the Spring Boot Maven profiles property that is a convenience shortcut of spring.profiles.active such as the followings :

The Maven user property is different according to the Spring Boot version.

For Spring Boot 1.4+, that is run.profiles :

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

For Spring Boot 2, that is spring-boot.run.profiles :

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

From the plugin documentation :

profiles:

The spring profiles to activate. Convenience shortcut of specifying the 'spring.profiles.active' argument. On command line use commas to separate multiple profiles.

Type: java.lang.String[]

Since: 1.3

Required: No

User Property: spring-boot.run.profiles

Share:
86,380
sandris
Author by

sandris

Updated on July 05, 2022

Comments

  • sandris
    sandris over 1 year

    Is there any way to input arguments when launching spring-boot application (mvn spring-boot:run) from commandline and then get them in main()?

  • sukrit007
    sukrit007 over 9 years
    Thanks. +1 for your answer.
  • geoand
    geoand over 9 years
    @sukrit007 Glad it helped you!
  • Ravindranath Akila
    Ravindranath Akila over 8 years
    Quite stupid of them to accept commas over the standard spaces. RTFM Spring: docs.oracle.com/javase/tutorial/essential/environment/…
  • Farrukh Najmi
    Farrukh Najmi over 6 years
    With gradle 3.3 the following modification worked for me: bootRun { // Usage: gradle bootRun -Pargs="arg1 arg2" if ( project.hasProperty('args') ) { args = (project.args.split("\\s+") as List) } }
  • geoand
    geoand over 6 years
    @FarrukhNajmi I will check it out and update the answer, thanks
  • user1902183
    user1902183 almost 6 years
    How do you specify arguments inside of the pom.xml configuration section of the plugin? I tried <arguments><argument>-Dprop=value</argument></arguments> but it does not pick up the property value this way.
  • mapm
    mapm over 5 years
    Starting from Spring Boot 2, you should use -Dspring-boot.run.arguments=
  • mapm
    mapm over 5 years
    Starting from Spring Boot 2, you should use -Dspring-boot.run.arguments=
  • splash
    splash over 5 years
    @user1902183 use <arguments><argument>--prop=value</argument></arguments>
  • Martin
    Martin over 2 years
    Note, this as of now accepted answer is out of date for Spring Boot 2.2 and higher. See the newer answer under this question - the arguments are now separated by a space, not by a comma.
  • Martin
    Martin over 2 years
    And you can mix unnamed parameters and named arguments like this: mvn spring-boot:run -Dspring-boot.run.arguments="parameter1 --arg2=value". Also probably advisable to quote all parameters in single quotes.