我正在尝试在类路径之外添加外部配置属性资源。它应该覆盖任何现有属性。
但以下不起作用:
@SpringBootApplication
@PropertySource("d:/app.properties")
public class MyClass extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyClass .class);
}
@Value("${my.property}")
private String myprop;
@PostConstruct
public void init() {
Sysout(myprop);
}
}
的src /主/资源/ application.properties:
my.property=internal
d:/app.properties:
my.property=external
启动应用时的结果:内部
为什么?
答案 0 :(得分:2)
你做不到。 @PropertySource
处理a well defined precedence order。您可以使用EnvironmentPostProcessor
以任意方式自定义环境。
我们在Devoxx演示文稿中解释该用例,请参阅this section of the presentation了解更多详情。您还可以find the code sample online。
特别是,如果您使用addFirst
,您会发现自定义PropertySource
优先于所有内容。但您也可以实现EnvironmentPostProcessor
,以便命令行参数或系统属性仍然覆盖这些值。我觉得这很有用但你的用例可能有所不同。
答案 1 :(得分:1)
通过在配置应用程序期间显式定义spring.config.location
属性来解决问题(因为编写后我无法在启动时将其添加为jvm环境属性):
@SpringBootApplication
public class MyClass extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(MyClass.class)
.properties("spring.config.location=file:d/app.properties");
}
}
答案 2 :(得分:0)
加载外部配置时有一个优先顺序 -
因此,您当前的结构是查找属性文件的最高实例
尝试将--spring.config.location添加到外部文件中,或将外部属性文件放在您从
开始弹出的目录中https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
答案 3 :(得分:0)
您可以尝试以下方法:
在@PropertySource
批注中给出两条路径,例如:
@PropertySource(value = { "classpath:application.properties",
"<Path to your external application.properties>" }, ignoreResourceNotFound = true)
,现在,如果外部文件的任何属性具有相同的key
,则外部文件将获胜,从而覆盖资源文件夹中的application.properties
。