到目前为止,我已经找到了两种方法来配置启动时的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参考链接