Spring Boot 以编程方式设置配置文件

Posted

技术标签:

【中文标题】Spring Boot 以编程方式设置配置文件【英文标题】:Spring Boot Programmatically setting profiles 【发布时间】:2015-09-24 20:45:05 【问题描述】:

如何在 Spring Boot 应用程序中设置活动配置文件。此应用程序将部署在独立的 Tomcat 中。

我有 2 个属性文件 application-profile.properties。

我的应用类

    @SpringBootApplication
        public class Application extends SpringBootServletInitializer 

            @Override
            protected SpringApplicationBuilder configure(SpringApplicationBuilder application)         
                return application.sources(Application.class);
            

            public static void main(String[] args) 
               System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "dev");
 ApplicationContext ctx = SpringApplication.run(Application.class, args);
      
    

如果我使用嵌入式 tomcat 运行应用程序,则开发配置文件将设置为活动状态并且可以正常工作。但是当我部署在独立的tomcat中时。它不起作用。

我尝试在配置方法中设置活动配置文件。但是当我从上下文中获取环境时,我得到空指针异常。

关于如何设置活动配置文件的任何帮助。

【问题讨论】:

【参考方案1】:

Spring Boot 2 中的另一种方法是使用 SpringApplicationBuilder:

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class MySpringProgram 

    public static void main(String[] args) 
        new SpringApplicationBuilder(MySpringProgram.class)
                .profiles("profile1", "profile2")
                .run(args);
    

【讨论】:

【参考方案2】:
SpringApplication app =new SpringApplication(Application.class);
    Properties props = new Properties();
    props.put("AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAM", "dev");
    app.setDefaultProperties(props);
    app.run(args);

我认为这段代码是更好的解决方案,因为它没有设置系统属性

【讨论】:

通常,Stack Overflow 更喜欢解释而不是“仅代码”的答案。考虑添加有关此代码如何回答问题的详细信息。【参考方案3】:
System.setProperty("spring.profiles.active", "dev");

【讨论】:

【参考方案4】:

您可以在启动时设置其他配置文件:

   SpringApplication springApp = new SpringApplication(Main.class);
   springApp.setAdditionalProfiles("profile1", "profile2");
   springApp.run(args);

【讨论】:

这是一个更好的答案 - 原因 - 接受的答案没有考虑在微配置文件服务器上完成的部署。在这些上,通常会部署许多战争,它们将共享 active.profiles 标志。通过接受接受的答案 - 我们将覆盖其他应用程序标志! @user1428716,哪个更好取决于您是要替换活动配置文件还是添加其他配置文件【参考方案5】:

我也遇到了同样的问题,折腾了半天终于解决了:

    @SpringBootApplication
    public class MyApplication extends SpringBootServletInitializer 

        public static void main(String[] args) 
            System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "dev");
            SpringApplication.run(MyApplication.class, args);
        

        @Override
        public void onStartup(ServletContext servletContext) throws ServletException 
            System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, "dev"); 
            super.onStartup(servletContext);
        
    

【讨论】:

【参考方案6】:

您可以将配置文件作为 vm-arguments 放在 catalina.sh 中,而不是动态激活配置文件

CATALINA_OPTS="-Dspring.profiles.active=dev"

【讨论】:

我也有类似的情况。到目前为止,application-profile 已创建并在通过 --spring.profiles.active=dev 运行应用程序时设置了活动配置文件。它工作正常。目前该应用程序是从 Eclipse 运行的。如果我将它部署到 tomcat,我该如何实现? @sunitha 您可以在 tomcat vm-rguments 中设置配置文件,它应该可以工作

以上是关于Spring Boot 以编程方式设置配置文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

使用 spring-boot 以编程方式添加另一个属性资源配置器

如果我们在Spring Boot中以编程方式配置数据源,spring boot数据源属性是否有效

以编程方式配置 Spring Boot 应用程序