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 配置中心的坑,命令行端口参数无效,被覆盖
CMAKE_INSTALL_PREFIX如何设置默认值,并且保留从命令行覆盖的能力?