使用命令行参数配置spring引导应用程序



到目前为止,我已经找到了两种方法来配置启动时的spring启动应用程序,一种使用-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的东西?为什么不工作和工作之间存在差异?

-D标准java选项将系统属性值设置为一对属性值,而默认情况下,SpringApplication将任何命令行选项参数(基本上是String值,对应于String[] args,前缀为--,例如--spring.profiles.active=test)转换为属性,并将其添加到Spring环境中,最终使用相同的名称覆盖该属性,如果它存在的话。

我看到一个可能的原因不可预测的行为在命令行选项的错误位置,如行java -jar --spring.profiles.active=test app.jar你包括,因为所有的命令行选项应该站在jar之后,所以命令应该被重写为java -jar app.jar --spring.profiles.active=test,以确保正确转换为属性的Spring框架。请注意,如果你的Spring应用程序试图从系统中读取一个值,而你将该属性作为命令行选项参数传递,那么应用程序将无法工作,当你设置了system属性,而Spring应用程序试图将其作为命令行属性读取时,也会发生同样的情况。

对于logback问题,--logging.config=file:logback.xml命令行选项参数正在工作,因为它等于覆盖Spring框架中存在的logging.config通用应用程序属性的值,另一个logback.configurationFile选项不是Spring通用属性,因此它不会被框架自动处理。

要解释这个答案,只需打开命令提示符或终端窗口&类型

$ 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参数调用)&--是传递给main类的参数[s];可以作为程序参数调用。
  • 这就是为什么当你的run没有给出args参数时,--不起作用,但-D不起作用。
  • 关于logback问题,VM参数不会工作,因为它不是由spring框架管理的,而是通过logging.config作为程序参数;SO参考链接

最新更新