如何从环境变量中添加活动弹簧配置文件?

Posted

技术标签:

【中文标题】如何从环境变量中添加活动弹簧配置文件?【英文标题】:How to add an active spring profile from an environment variable? 【发布时间】:2017-03-30 23:18:02 【问题描述】:

到目前为止,我在 ~/.bash_profile 中设置了以下环境变量:

export SPRING_PROFILES_ACTIVE=local

这设置了我的活动弹簧配置文件。但现在,我想将本地配置文件添加application.properties 中定义的其他配置文件,而不是替换它们。

在Spring Boot documentation 中,有一个关于添加活动配置文件的部分,但我没有看到关于从环境变量添加活动配置文件的内容。

我尝试设置SPRING_PROFILES_INCLUDE 环境变量,但是没有效果。

如何做到这一点?

P.S.:我使用的是 Spring Boot 1.4.2。

【问题讨论】:

您是否尝试过使用 ConfigurableEnvironment docs.spring.io/spring-framework/docs/current/javadoc-api/org/… 不,我没有,但我更喜欢使用 Olszewski 之类的解决方案。 【参考方案1】:

使用默认添加配置文件

您可以在 application.properties 文件中使用表达式在定义的配置文件旁边引入您自己的环境变量。例如,如果您当前的文件如下所示:

spring.profiles.active=profile1,profile2

使用自定义环境变量,它将变为:

spring.profiles.active=profile1,profile2,$ADDITIONAL_APP_PROFILES:local

其中ADDITIONAL_APP_PROFILES 是您设置的环境变量的名称,而不是SPRING_PROFILES_ACTIVE

当变量未在当前环境中设置时使用值local。在这种情况下,名为local 的配置文件将被激活。如果您未设置默认值且环境变量不存在,则整个表达式将用作活动配置文件的名称。

无默认添加配置文件

如果您想避免激活默认配置文件,可以删除变量表达式前的占位符值和逗号:

spring.profiles.active=profile1,profile2$ADDITIONAL_APP_PROFILES

但在这种情况下,当前环境中设置的变量必须以逗号开头:

export ADDITIONAL_APP_PROFILES=,local

【讨论】:

【参考方案2】:

您链接到的文档中的下一句:

有时,将特定于配置文件的属性添加到活动配置文件而不是替换它们是有用的。 spring.profiles.include 属性可用于无条件添加活动配置文件。

因此您可以使用命令行参数启动您的应用程序:

-Dspring.profiles.include=$SPRING_PROFILES_INCLUDE

【讨论】:

【参考方案3】:

这是从系统 env 或 jvm arg添加以编程方式附加的活动配置文件的示例。

@Configuration
public class ApplicationInitializer implements WebApplicationInitializer, ApplicationContextInitializer<ConfigurableWebApplicationContext> 

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException 
        servletContext.setInitParameter("contextInitializerClasses", this.getClass().getCanonicalName());
    

    @Override
    public void initialize(ConfigurableWebApplicationContext applicationContext) 
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        environment.addActiveProfile(System.getProperty("myProperty"));
        environment.addActiveProfile(System.getEnv("myProperty"));
    

【讨论】:

【参考方案4】:

为了支持 bash 环境,可用的值为 SPRING_PROFILES_ACTIVESPRING_PROFILES_DEFAULT

不是,SPRING_PROFILES_INCLUDE

您可能必须使用命令行方式 -Dspring.profiles.include 或使用 ConfigurableEnvironment 以编程方式锻炼

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/env/AbstractEnvironment.html#ACTIVE_PROFILES_PROPERTY_NAME

【讨论】:

对不起,我只看懂了你的一半。你能改写一下吗?

以上是关于如何从环境变量中添加活动弹簧配置文件?的主要内容,如果未能解决你的问题,请参考以下文章

当特定的弹簧配置文件处于活动状态时,如何防止运行测试?

如何使用 Maven 配置文件设置弹簧活动配置文件

如何在某个弹簧配置文件中禁用飞路?

使用 bootWar 设置活动弹簧配置文件

在 docker 中使用 gradle 设置活动弹簧配置文件没有任何效果

覆盖多个弹簧活动配置文件的属性值