当前位置: 首页 > 知识库问答 >
问题:

使用命令行参数配置Spring启动应用程序

柳刚豪
2023-03-14

到目前为止,我发现了两种在启动时配置spring boot应用程序的方法,一种使用< code>-D,另一种使用< code> - ,如下所示:

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);
}

而今天,我在命令行配置日志,发现 -Dlogback.configuration 文件=/full_path/日志.xml不起作用,--logging.config=file:日志.xml工作。

以上可能有其他原因,可能< code > log back . configuration file 是错误的,但它的行为就像< code>-D和< code> - 的区别。

那么我的问题是-D--是什么,是Java还是Spring的东西?为什么它在不工作和工作之间有所不同?

共有2个答案

狄玉书
2023-03-14

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

$ 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

    < li> -D是用于设置系统属性的选项(可以作为VM参数调用)
叶福
2023-03-14

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

我在命令行选项的错误位置看到了不可预测行为的可能原因,如<code>java-jar--spring.profiles。活动=测试应用程序。jar之所以包含,是因为所有命令行选项都应该位于jar之后,因此命令应该重写为<code>java-jar app。jar--spring.profiles。active=test以确保Spring框架正确转换为属性。请注意,如果您的Spring应用程序在将属性作为命令行选项参数传递时试图从系统中读取值,则应用程序将无法工作,当您设置系统属性,并且Spring应用软件试图将其作为命令行属性读取时,也会发生同样的情况。

对于logback问题,--logging.config=file:logback。xml命令行选项参数有效,因为它是否等于覆盖日志记录的值。配置Spring框架中存在的通用应用程序属性,另一个<code>logback。configurationFile选项不是Spring公共属性,因此框架不会自动处理它。

 类似资料: