Springboot:"additional-location" 中的配置被 "application-{profile}" 覆盖



这是一个简单的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…

  1. 命令行参数

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文件中。

    最新更新