Spring:从命令行覆盖一个 application.property

Posted

技术标签:

【中文标题】Spring:从命令行覆盖一个 application.property【英文标题】:Spring: overriding one application.property from command line 【发布时间】:2016-08-31 08:59:39 【问题描述】:

我有一个带有默认变量值的 application.properties 文件。我希望能够在使用mvn spring-boot:run 运行时更改其中一个。我找到了如何更改整个文件,但我只想更改其中的一两个属性。

【问题讨论】:

【参考方案1】:

您可以将单个属性作为命令行参数传入。例如,如果你想设置server.port,你可以在启动一个可执行jar时执行以下操作:

java -jar your-app.jar --server.port=8081

或者,如果您在 Spring boot 2.x 中使用 mvn spring-boot:run

mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081"

或者,如果您使用的是 Spring Boot 1.x:

mvn spring-boot:run -Drun.arguments="--server.port=8081"

您还可以在应用程序的pom.xml 中为spring-boot:run 配置参数,这样就不必每次都在命令行中指定它们:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <arguments>
            <argument>--server.port=8085</argument>
        </arguments>
    </configuration>
</plugin>

【讨论】:

@yuli 我已经编辑了你的问题并更新了我的答案,当你使用mvn spring-boot:run时提供了一些选项 我收到org.kohsuke.args4j.CmdLineException: "--server.port=8181" is not a valid option Spring Boot 不使用 args4j,所以失败一定来自你的代码 请注意: 1. 参数应以逗号分隔 2. 每个参数应以 -- 为前缀,例如。 -Dspring-boot.run.arguments="--server.port=8081,--customArgument=custom" 如果参数是 application.properties 中的自定义参数,比如 myValue,它还能工作吗?【参考方案2】:

更新一点,Spring Boot 1.X Maven 插件依赖于--Drun.arguments Maven 用户属性,但 Spring Boot 2.X Maven 插件依赖于-Dspring-boot.run.arguments Maven 用户属性。

所以对于 Spring 2,你需要这样做:

mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081"

如果你需要传递多个参数,你必须使用,作为分隔符,并且不要在参数之间使用空格:

mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8081,--foo=bar"

关于 maven 插件配置和从 fat jar 传递参数的方式,它没有改变。 所以非常好的安迪威尔金森答案仍然是正确的。

【讨论】:

酷!。 -Dproperty1=value1 -Dproperty2=value2 等系统属性也可以通过 mvn spring-boot:run -Dspring-boot.run.arguments="--property1=value1,--property2=value2"跨度> 不适合我。如果我放一个空格,应用程序将不会检测到参数,如果我放一个空格,SDK 将不会读取它。还在寻找如何添加application.properties args。【参考方案3】:

快速更新:

如果您使用的是最新版本的 spring-boot 2.X 和 maven 3.X,以下命令行将覆盖您的服务器端口:

java -jar -Dserver.port=9999   your_jar_file.jar

【讨论】:

他们到底为什么要把它改成所有事物的这种语法? -D? 他们没有定义那种语法。这就是java 可执行文件用于定义系统属性 的语法(可以从System.getProperty() 获得的那种)。除了其他来源之外,Spring 只会抓取这些。【参考方案4】:

您可以设置一个环境变量来覆盖这些属性。例如,您有一个属性名称 test.props=1 。如果你有一个环境变量TEST_PROPS,spring boot 会自动覆盖它。

export TEST_PROPS=2
mvn spring-boot:run

您还可以创建一个包含您需要覆盖的所有属性的 json 字符串,并使用 -Dspring.application.json 传递它或使用 SPRING_APPLICATION_JSON 导出 json。

mvn spring-boot:run -Dspring.application.json='"test.props":"2"'

或者只使用 -Dtest.props=2 传递属性

mvn spring-boot:run -Dtest.props=2

在 spring boot 2.1.17 和 maven 3.6.3 上测试

【讨论】:

【参考方案5】:

如果不使用逗号,要在多个模式下覆盖一些自定义属性或 spring boot 属性,请使用空格而不是逗号,如下面的代码:

mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8899 --your.custom.property=custom"

【讨论】:

【参考方案6】:

在 Spring Boot 中,我们可以覆盖如下属性

mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8082

【讨论】:

以上是关于Spring:从命令行覆盖一个 application.property的主要内容,如果未能解决你的问题,请参考以下文章

记录一个 spring cloud 配置中心的坑,命令行端口参数无效,被覆盖

从命令行覆盖 qmake 变量

CMAKE_INSTALL_PREFIX如何设置默认值,并且保留从命令行覆盖的能力?

从命令行上传时如何覆盖pypi包?

从 MSI 安装程序的命令行覆盖“文本框”对话框字段(Visual Studio 2010 Web 设置)

来自命令行的 Xcode 代码覆盖率