springboot:config被“application-{profile}”覆盖

2guxujil  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(235)

这是一个简单的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 .
我配置 testapplication.properties :

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"

it打印 test in command .
我读过文件:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-具有外部配置。但我没找到有用的线索。
我的目的是用out配置替换应用程序中的某些属性,这样就不必更改源代码和重新打包。
谢谢你的帮助!

14ifxucb

14ifxucb1#

链接文档特别列出了财产来源的优先顺序:
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 属性到 application-dev.properties 中列出的目录中的文件 --spring.config.additional-location 路径。

相关问题