如何在Spring-Boot生产期间覆盖application.properties?

时间:2014-05-09 11:23:22

标签: java spring spring-boot

我正在使用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 ,这个问题

8 个答案:

答案 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

请参阅spring external config doc

更新: 您可以将\ @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配置优先级如下。

  1. ServletConfig初始化参数
  2. ServletContext初始化参数
  3. JNDI属性
  4. System.getProperties()

因此,如果您愿意,您的配置将在命令行中被覆盖。但是,尽管可以使用多个配置文件,但建议还是避免覆盖。