How to set active profile programmatically for any environment?

mg. picture mg. · Mar 7, 2017 · Viewed 12.3k times · Source

I want to set active profile host dependent for any envrionment and cannot find an environment independent hook.

Following factory will set the active profile before application context will build.

/META-INF/spring.factories

org.springframework.context.ApplicationContextInitializer=MyApplicationContextInitializer

MyApplicationContextInitializer.java

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext ca) {
        ConfigurableEnvironment environment = ca.getEnvironment();
        environment.addActiveProfile("myHost");
    }
}

If this example is executed in a mock environment by JUnit ...

*Test.java

...
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
...

... following will be logged.

...
... RestControllerTests   : The following profiles are active: myHost
...

but profile myHost is not active and default profile will be used in context of JUnit!

A test as Java Application and JUnit with VM arguments works ...

-Dspring.profiles.active=myHost

I use a war packaged spring-boot-starter-web app and programmatically profile shall be set and used in any environment

  • Java Application
  • JUnit
  • Servlet Container

How do I set the profile programmatically for any environmnet?

I do not want to use VM arguments or environemt variables because the profile shall be set by the current host name.

Answer

varun myadam picture varun myadam · Oct 25, 2019

Simplest answer after a lot of googling :)

@SpringBootApplication
public class ExampleMain2 {

  public static void main(String[] args) {
      ConfigurableEnvironment environment = new StandardEnvironment();
      environment.setActiveProfiles("dev");

      SpringApplication sa = new SpringApplication(ExampleMain2.class);
      sa.setEnvironment(environment);
      sa.setAdditionalProfiles("remote","live");
      sa.run(args);
  }
}