从 spring-boot:run 获取命令行参数

Posted

技术标签:

【中文标题】从 spring-boot:run 获取命令行参数【英文标题】:Get command-line arguments from spring-boot:run 【发布时间】:2014-06-12 13:38:27 【问题描述】:

从命令行启动 spring-boot 应用程序 (mvn spring-boot:run) 时有什么方法可以输入参数,然后在 main() 中获取它们?

【问题讨论】:

【参考方案1】:

查看spring-boot-maven-plugin的source code发现需要做:

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

获取有关spring-boot 插件的run 目标支持哪些选项的更多信息的另一种方法是执行以下命令:

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

对于 Spring Boot 2.x,源是 here,您现在需要使用 -Dspring-boot.run.arguments="args1,args2"

(从 2021 年 4 月开始编辑) 对于 Spring Boot 2.2+,您现在需要使用 -Dspring-boot.run.arguments="args1 args2"

如果你正在使用 Gradle,并且希望能够将命令行参数传递给 Gradle bootRun 任务,则首先需要进行配置,例如:

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

并使用gradle bootRun -Pargs="arg1 arg2" 运行任务

【讨论】:

谢谢。为您的回答 +1。 @sukrit007 很高兴它帮助了你! 他们很愚蠢地接受标准空格上的逗号。 RTFM 弹簧:docs.oracle.com/javase/tutorial/essential/environment/… 使用 gradle 3.3,以下修改对我有用:bootRun // Usage: gradle bootRun -Pargs="arg1 arg2" if ( project.hasProperty('args') ) args = (project.args.split("\\s+") as List) 从 Spring Boot 2 开始,你应该使用-Dspring-boot.run.arguments=【参考方案2】:

如果您使用的是 Eclipse...

|参数名称 |价值 | |运行参数 | "--name=亚当" |

【讨论】:

【参考方案3】:

当使用 -Drun.arguments 传递多个参数时,如果参数又具有“逗号分隔”值,则仅使用每个参数的第一个值。为了避免这种情况,重复参数的次数与值的数量一样多。

这更像是一种解决方法。除非分隔符不同,否则不确定是否有其他选择 - 例如“|”。

例如问题:

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

只为上述命令选择“测试”配置文件。

解决方法:

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

为上述命令选择“开发”和“测试”配置文件。

【讨论】:

从 Spring Boot 2 开始,你应该使用-Dspring-boot.run.arguments=【参考方案4】:

这对我有用 (spring-boot v1.4.3.RELEASE),。

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

【讨论】:

【参考方案5】:

注意:传递参数的方式取决于spring-bootmajor.minor 版本。

TLDR

对于 Spring Boot 1:

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

对于 Spring Boot 2.0 和 2.1:

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

(从 2021 年 4 月开始编辑) 对于 Spring boot 2.2 及更高版本:

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

    spring-boot-maven-plugin 版本和您使用的Spring Boot 版本必须对齐。

根据使用的Spring Boot主要版本(12),确实应该使用12版本中的spring-boot-maven-plugin。 如果您的 pom.xml 继承自 spring-boot-starter-parent

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

在你的 pom 中,甚至不应该指定使用的插件版本,因为这个插件依赖是继承的:

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

如果您的pom.xml 不是从spring-boot-starter-parent 继承,请不要忘记将spring-boot-maven-plugin 的版本与您要使用的spring boot 的确切版本对齐。

    使用 spring-boot-maven-plugin:1.X.X 在命令行中传递参数

对于一个论点:

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

对于多个:

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

maven plugin page 记录了它:

  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.
    使用 spring-boot-maven-plugin:2.X.X 在命令行中传递参数

对于一个论点:

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

对于多个:

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

我没有找到引用那个的 2.X.X 版本的插件文档。 但是spring-boot-maven-plugin:2.0.0.M3 插件的org.springframework.boot.maven.AbstractRunMojo 类引用了这个用户属性:

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;
   
   ...
 

    提示:当您传递多个参数时,会考虑逗号之间的空格。

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

将被解释为["argOne", "argTwo"]

但是这个:

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

将被解释为["argOne", " argTwo"]

(从 2021 年 3 月开始编辑)

空格现在用作多参数命令的分隔符,请参阅相关的issue。

【讨论】:

如何在插件的 pom.xml configuration 部分中指定参数?我试过&lt;arguments&gt;&lt;argument&gt;-Dprop=value&lt;/argument&gt;&lt;/arguments&gt;,但它不会以这种方式获取属性值。 @user1902183 使用&lt;arguments&gt;&lt;argument&gt;--prop=value&lt;/argument&gt;&lt;/arguments&gt;【参考方案6】:

Spring Boot 1 as 2 提供了一种将多个配置文件作为参数传递的方法,并避免了与逗号用作参数之间的分隔符和作为活动配置文件传递的值相关的问题。

所以不要写:

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

使用the Spring Boot Maven profiles property,这是spring.profiles.active 的便捷快捷方式,如下所示:

Maven 用户属性根据 Spring Boot 版本不同。

对于 Spring Boot 1.4+,即run.profiles

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

对于 Spring Boot 2,即spring-boot.run.profiles

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

来自插件文档:

个人资料

要激活的弹簧配置文件。指定的便捷快捷方式 'spring.profiles.active' 参数。在命令行使用逗号 分开多个配置文件。

类型:java.lang.String[]

自:1.3

必填:否

用户属性:spring-boot.run.profiles

【讨论】:

【参考方案7】:

对于最新版本的 spring 使用 -Dspring-boot.run.arguments= 如下例所示

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

【讨论】:

【参考方案8】:

今天查了一下,Spring Boot 2.2.5的正确用法是:

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

因为帮助说:

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.

【讨论】:

您可以像这样混合未命名参数和命名参数:mvn spring-boot:run -Dspring-boot.run.arguments="parameter1 --arg2=value"。也可能建议用单引号引用所有参数。【参考方案9】:

我使用的是 spring.boot 2.4.2,我用空格分隔参数并将值放在双引号之间。

mvn spring-boot:run -Dspring-boot.run.arguments="--param1=value2 --param2=value2"

【讨论】:

以上是关于从 spring-boot:run 获取命令行参数的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 实战 / mvn spring-boot:run 参数详解

go语言 从命令行获取参数解析

Spring Boot Maven 插件 - spring-boot:run 和优雅关闭

python 蟒蛇从命令行中获取参数

如何:可以从 Unix 命令行获取参数的 MATLAB 脚本

如何从 shell 获取准确的命令行字符串?