这是一个简单的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
.
我配置 test
在 application.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配置替换应用程序中的某些属性,这样就不必更改源代码和重新打包。
谢谢你的帮助!
1条答案
按热度按时间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
路径。