Spring Boot以编程方式设置配置文件 在Spring Boot中,可以通过编程方式设置配置文件的激活的profile。通过这种方式,可以根据不同的环境要求来动态地加载不同的配置。 要以编程方式设置profile,可以使用`SpringApplication`类的`setAdditionalProfiles`方法。该方法接受一个字符串数组作为参数,用于指定要激活的profile。 以下是一个示例代码: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication app = new SpringApplication(Application.class); app.setAdditionalProfiles("dev"); // 设置要激活的profile app.run(args); } } ``` 在上面的示例中,我们通过调用`setAdditionalProfiles`方法将"dev"作为参数传递给`SpringApplication`对象。这将激活名为"dev"的配置文件。 通过这种方式,我们可以根据需要动态地设置profile,以适应不同的环境要求。这在开发和部署过程中非常有用,可以轻松地切换不同的配置。

26
如何在Spring Boot应用程序中设置活动配置文件。此应用程序将部署在独立的Tomcat上。
我有2个属性文件application-{profile}.properties。
我的Application类。
    @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中部署时,它无法正常工作。

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

请问如何设置活动配置文件。

6个回答

27

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

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

3
这是一个更好的答案 - 原因是,已接受的答案没有考虑到在微配置文件服务器上进行的部署。在这些服务器上,通常会部署许多war文件,它们会共享active.profiles标志。如果按照已接受的答案进行操作,我们将覆盖其他应用程序标志! - user1428716
1
@user1428716,哪一种更好取决于您是想替换活动配置文件还是添加附加配置文件。 - Kymo Wang
这会在开头添加附加配置,有没有方法将它们设置到结尾?例如,如果当前配置文件设置为"profile0",则springApp.setAdditionalProfiles("profile1", "profile2");将使它变为"profile1,profile2,profile0"。 - Arun Gopalpuri

21

我也遇到了同样的问题,经过半天的努力,最终得出了以下结果:

    @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);
        }
    }

14

使用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);
    }
}

3

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

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

我有一个类似的情况。目前,应用程序已创建并在通过--spring.profiles.active=dev运行应用程序时设置了活动配置文件。它运行良好。目前该应用是从Eclipse中运行的。如果我将其部署到Tomcat,我该如何实现这一点? - sunitha
@sunitha,你可以在Tomcat的VM参数中设置配置文件,这样应该就可以工作了。 - Mukun

3
System.setProperty("spring.profiles.active", "dev");

1
SpringApplication app =new SpringApplication(Application.class);
    Properties props = new Properties();
    props.put("AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAM", "dev");
    app.setDefaultProperties(props);
    app.run(args);

我认为这个代码是更好的解决方案,因为它不会设置系统属性。

3
通常情况下,Stack Overflow 更喜欢解释性的答案,而非只有代码的答案。考虑对这段代码如何回答问题进行详细说明。 - Vaccano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接