这是一个简单的springboot项目。只有几个属性和MainClass
:
@Slf4j
@SpringBootApplication
public class DemoApplication {
@Value("${test}")
String test;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@PostConstruct
public void print() {
log.info(test);
}
}
它只是打印变量test
的值。
我在application.properties
:中配置test
test=test normal
spring.profiles.active=dev
变量被application-dev.properties
:覆盖
test=test in dev
然后我运行应用程序,它工作。打印:test in dev
接下来就是问题:
我将该应用程序打包为jar,并且我希望在运行该应用程序时覆盖test
,因此我编写了一个文件out.properties
:
test=test in out
通过命令启动应用程序
java -jar target/demo.jar --spring.config.additional-location=out.properties
它仍然打印test in dev
我将命令更改为:
java -jar target/demo.jar --test="test in command"
它打印test in command
。
我已阅读该文件:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-具有外部配置。但我没有找到有用的提示。
我的目的是用out配置替换应用程序中的一些属性,这样我就不必更改源代码并重新打包。
谢谢你的帮助!
链接的文档专门列出了属性源的优先级顺序:
1-3…
- 命令行参数
5-11…
在打包的jar之外配置特定的应用程序属性(application-{Profile}.properties和YAML变体(。
封装在jar中的概要文件特定的应用程序属性(application-{Profile}.properties和YAML变体(。
打包jar之外的应用程序属性(Application.properties和YAML变体(。
封装在jar中的应用程序属性(Application.properties和YAML变体(。
16-17…
正如您的代码已经向您展示的那样,(4(--test="test in command"
覆盖(12-15(属性文件中的任何内容。
您还可以看到,(12-13(配置文件特定的应用程序属性文件总是覆盖(14-15(非配置文件的应用程序属性。
因此,如果您希望外部文件覆盖(13(个打包的配置文件特定的应用程序属性文件,则必须将该属性放置在(12(个外部配置文件专用的应用程序特性文件中。
但是,正如第2.4节所述。配置文件特定属性显示:
如果在
spring.config.location
中指定了任何文件,则不考虑这些文件的配置文件特定变体如果您还想使用配置文件特定的属性,请使用spring.config.location
中的目录。
换句话说,spring.config.location
中列出的任何文件根据定义都是(14(应用程序属性文件,无论它是如何命名的,因此(12-13(配置文件特定的应用程序属性将覆盖它们,无论是(13(打包的还是(12(外部的。
摘要:
将test=test in out
属性移动到--spring.config.additional-location
路径中列出的目录中的application-dev.properties
文件中。