使用命令行参数配置Spring Boot应用程序。

6

到目前为止,我发现有两种方法可以在启动时配置Spring Boot应用程序。其中一种使用-D,另一种使用--,就像这样:

java -jar -Dspring.profiles.active=test app.jar
java -jar --spring.profiles.active=test app.jar

有时第一个有效,有时第二个有效。作为一名开发者发现,在下面示例的run方法未提供args参数时,--方法不起作用,但-D有效。
public static void main(final String[] args) {
    SpringApplication.run(Application.class, args);
}

今天我在命令行配置logback时发现-Dlogback.configurationFile=/full_path/logback.xml无效,但--logging.config=file:logback.xml有效。
可能还有其他原因,比如logback.configurationFile拼写错误,但它们的区别类似于-D--
我的问题是什么是-D--,它是Java或Spring的东西吗?为什么会有有效无效之分?
2个回答

3
-D标准的Java选项设置系统属性值作为一个属性, 值对,而默认情况下SpringApplication会将任何命令行选项参数(实质上是与String[] args相对应的String值,并带有前缀--,例如--spring.profiles.active=test)转换为属性,并将其添加到Spring环境中,如果该属性已存在,则最终覆盖该属性。
我发现命令行选项的位置不正确可能会导致不可预测的行为,例如你提供的java -jar --spring.profiles.active=test app.jar命令行,因为所有命令行选项都应该在JAR文件之后,所以应该重写命令为java -jar app.jar --spring.profiles.active=test,以确保Spring框架正确将其转换为属性。请注意,如果Spring应用程序尝试从系统读取值,同时您将属性作为命令行选项参数传递,该应用程序将无法工作;同样,当您设置系统属性并且Spring应用程序试图将其读取为命令行属性时也会发生这种情况。
对于logback问题,--logging.config=file:logback.xml命令行选项参数是有效的,因为它等同于覆盖Spring框架中存在的logging.config公共应用程序属性的值,而另一个logback.configurationFile选项不是Spring公共属性,因此不会被自动处理。

2
为了解释这个答案,只需打开命令提示符或终端窗口,然后输入:
$ java --help
Usage: java [options] <mainclass> [args...]
           (to execute a class)
   or  java [options] -jar <jarfile> [args...]
           (to execute a jar file)
  ...
 Arguments following the main class, source file, -jar <jarfile>,
 -m or --module <module>/<mainclass> are passed as the arguments to
 main class.

 where options include:
    ...
    -D<name>=<value>
                  set a system property
    ...

根据此帮助文档,-D--来自Java:
  • -D是用于设置系统属性(可称为VM参数)的选项,而--是传递给主类的一个或多个参数,可称为程序参数。
  • 这就是当您的run未给出args参数时,--不起作用但-D仍可使用的原因。
  • 关于logback问题,VM参数无法工作,因为其不受Spring Framework管理,但将logging.config作为程序参数传递可以,参考SO参考链接

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接