我正在使用spring boot和application.properties
在@Configuration @Profile("dev")
开发期间选择数据库。
spring.profiles.active=dev
spring.config.location=file:d:/application.properties
在制作期间,我想创建一个应该加载的应用程序上下文之外的文件,然后使用d:/application.properties激活不同的配置文件:
spring.profiles.active=production
结果:当我启动应用程序时,配置仍为dev
,因此不会考虑生产属性文件的其他位置。我错过了什么吗?
spring boot 1.1.0.BUILD-SNAPSHOT
注意:关于 tomcat ,这个问题不。
答案 0 :(得分:11)
我知道你问过怎么做。
但答案是,你不应该这样做。
您可以拥有application.properties application-default.properties application-dev.properties等
您可以通过命令行参数将配置文件切换到jvm
你可以使用@TestPropertySource
在测试时覆盖一些东西理想情况下,所有内容都应该在源代码管理中,这样就不会有任何意外 - 您如何知道服务器位置中存在哪些属性,以及缺少哪些属性。如果开发人员介绍新事物会发生什么。
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
Spring boot已经为你提供了足够的方法来做到这一点。
答案 1 :(得分:10)
您也可以使用@PropertySources
@PropertySources({
@PropertySource(value = "classpath:application.properties"),
@PropertySource(value = "file:/user/home/external.properties", ignoreResourceNotFound = true)
})
public class Application {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
}
}
答案 2 :(得分:8)
我不确定您是否可以动态更改个人资料。
为什么不将内部属性文件与 spring.config.location 属性设置为所需的外部位置,以及该位置的属性文件(在jar)是否设置了 spring.profiles.active 属性?
更好的是,有一个特定于dev配置文件的内部属性文件(具有spring.profiles.active = dev)并保持原样,当你想在生产中部署时,为你的属性文件指定一个新的位置,有spring.profiles.active = prod:
java -jar myjar.jar --spring.config.location=D:\wherever\application.properties
答案 3 :(得分:5)
更新: 这是春天的一个错误,请参阅here
jar之外的应用程序属性必须位于以下某个位置,然后一切都应该有效。
21.2 Application property files
SpringApplication will load properties from application.properties files in the following locations and add them to the Spring Environment:
A /config subdir of the current directory.
The current directory
A classpath /config package
The classpath root
所以,例如这应该工作,当你不想指定cmd行args而你不在你的基础app.props中使用spring.config.location:
d:\yourExecutable.jar
d:\application.properties
or
d:\yourExecutable.jar
d:\config\application.properties
更新: 您可以将\ @Configuration与\ @PropertySource一起使用。 根据文档here,您可以在任何地方指定资源。你应该小心,加载哪个配置以确保你的作品获胜。
答案 4 :(得分:3)
使用Spring Boot 2.2.2.Release更新。
完整示例,documentation
假设在您的jar文件中,您有具有以下两行的application.properties:
<CircularProgress progress={timing({clock, to: 0, easing: Easing.linear, duration: 10000 })}/>
然后,在生产环境中,您要覆盖server.port = 8888,但不想覆盖其他属性。
首先,创建另一个文件,例如override.properties,并使该行在线:
server.servlet.context-path=/test
server.port=8081
然后您可以像这样启动jar
server.port=8888
答案 5 :(得分:2)
我发现以下对我有用:
java -jar my-awesome-java-prog.jar --spring.config.location=file:/path-to-config-dir/
添加了 file:
。
后期编辑
当然,此命令行永远不会在生产环境中运行。
我有
shell
脚本[可能是几层,带有占位符,用于命令的所有可能更改的部分(jar的名称,配置路径...)ansible
部署脚本,它将部署shell
脚本并用实际值替换占位符。答案 6 :(得分:1)
从Spring Boot 2开始,您将不得不使用hidden: true
答案 7 :(得分:0)
spring配置优先级如下。
因此,如果您愿意,您的配置将在命令行中被覆盖。但是,尽管可以使用多个配置文件,但建议还是避免覆盖。