Spring Boot应用程序中的特定于环境的application.properties文件


85

在我的Spring Boot应用程序中,我想创建特定于环境的属性文件。我在战争中应用程序的包装类型,我正在嵌入式tomcat中执行它。我使用sts并从sts本身执行main。

  1. 我可以拥有特定于环境的属性文件,例如application-$ {env-value} .properties吗?

在上述情况下,env-value的值将为local / devl / test / prod

  1. 在哪里设置环境值文件?对于本地,我可以通过sts将其设置为jvm参数

  2. 谁在S​​pring Boot应用程序中读取application.properties。

  3. 如何加载环境特定的属性文件?例如-如果我在特定于环境的属性文件中设置数据库uid,pwd,schema等,在这种情况下,数据源将能够理解其中的属性吗?

  4. 我可以同时使用application.properties和application-local.properties文件吗?


你读过这个吗?它基本上是开箱即用的。
M. Deinum

我做到了,但是那没有用。所以我在同一位置有application.properties文件和application-local.properties文件。application-local.properties文件包含与数据库相关的属性。application.properties中具有关于spring mvc的单个属性。我还添加了-Dprofile = local作为调试配置,但此值未获得使用
user3534483

因为您需要设置spring.active.profiles使用-Dspring.active.profiles=local。代替。
Deinum M. 15年

没有成功的先生。因此,我现在使用-Dspring.active.profiles = local而不是-Dprofile。然后在我的配置文件中,尝试获取值String driverClassName = env.getProperty(“ driverClassName”); env是春季的环境
user3534483 2015年

1
对不起,不好,把它混在一起:)。
Deinum M. 15年

Answers:


170

Spring Boot已经支持基于配置文件的属性。

只需添加application-[profile].properties文件并使用spring.profiles.active属性指定要使用的配置文件。

-Dspring.profiles.active=local

这将加载application.propertiesapplication-local.properties与来自第一后者压倒一切的性质。


1
我们是否可以在不加载应用程序属性的情况下将其属性与其他文件一起用于特定配置文件?例如测试还是开发?
Hassam Abdelillah '16

1
M. Deinum,我也有类似的问题,我有application.yml和application-qa.yml,我给了-Dspring.profiles.active = qa,这两个文件都可以读取,但是application-qa.yml的属性不会覆盖来自application.yml的属性,我总是只能看到来自application.yml的属性?有什么方法可以指定优先级?
Suresh Chaganti


我正在为aws lambda编写代码,并且可以将此key = value传递为环境值-可以使用System.getenv()进行访问-它将起作用吗?
Abdeali Chandanwala

我有4个application- {profile} .properties文件。我想在不同的环境中运行相同的jar文件,让我们说一下dev,test,prod。所以我不能使用-Dspring.profiles.active = local。如果我缺少某些东西,请纠正我。
Ashish Burnwal '17

24

是的你可以。由于您使用的是弹簧,因此请查看@PropertySource注释。

使用以下注释您的配置

@PropertySource("application-${spring.profiles.active}.properties")

您可以随意命名,也可以添加多个属性文件。如果您有更多属于所有环境的设置和/或默认值(也可以使用@PropertySource {...,...,...}编写),可能会很好。

@PropertySources({
  @PropertySource("application-${spring.profiles.active}.properties"),
  @PropertySource("my-special-${spring.profiles.active}.properties"),
  @PropertySource("overridden.properties")})

然后您可以使用环境启动应用程序

-Dspring.active.profiles=test

在此示例中,名称将替换为application-test-properties等。


2
问题是这$spring.profiles.active}是一个由数组/逗号分隔的字符串。因此,当有多个配置文件处于活动状态时,它可能无法完成您期望/想要做的事情。
M. Deinum '16

的确如此,但是对于两个配置文件都可以正常工作-一个默认值和一个使用PropertySource定义的配置文件。对于更高级的属性处理,我认为您将不得不在Spring之外。另外,PropertySource仅在启动期间读取。其他用于属性处理的更高级的库也可以更改属性运行时。

2
这行得通,但是我仍然不明白为什么我必须手动执行此操作。在我的另一个存储库中,我不必这样做。
The Java Guy

7

我们可以这样:

application.yml中

spring:
  profiles:
    active: test //modify here to switch between environments
    include:  application-${spring.profiles.active}.yml

application-test.yml中

server:
  port: 5000

并在application-local.yml中

server:
  address: 0.0.0.0
  port: 8080

然后Spring Boot将按照我们的意愿启动我们的应用程序。


2
您不是用这种方式对活动配置文件进行硬编码吗?:(
安娜·梅杜赫

0

我的观点,以这种a回的方式要求开发人员一次性创建所有相关的环境,从而有可能将生产配置暴露给最终开发人员

根据12要素,不应仅是特定于环境的环境。

我们如何为CI CD做

  • 一次构建Spring并升级到另一个环境,在这种情况下,如果我们的Spring jar具有所有环境,那么它将带来安全风险,因为GIT中的所有环境都是变量
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.