How to set active spring 3.1 environment profile via a properites file and not via an env variable or system property

Fabian picture Fabian · Dec 21, 2011 · Viewed 66k times · Source

We use the new environment profiles feature of spring 3.1. We currently set the active profile by setting the environment variable spring.profiles.active=xxxxx on the server to which we deploy the application.

We think this is a suboptimal solution as the war file we want to deploy should just have an additional properties file which sets the environment in which the spring app context should load so the deployment is not dependent on some env var set on the server.

I tried to figure out how to do that and found:

ConfigurableEnvironment.setActiveProfiles()

which I can use to programmatically set the profile but then I still don't know where and when to execute this code. Somewhere where the spring context loads up? Can I load the parameter I want to pass to the method from a properties file?

UPDATE: I just found at docs which I might be able to implement to set the active profile?

Answer

Tomasz Nurkiewicz picture Tomasz Nurkiewicz · Dec 21, 2011

In web.xml

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>profileName</param-value>
</context-param>

Using WebApplicationInitializer

This approach is used when you don't have a web.xml file in Servlet 3.0 environment and are bootstrapping the Spring completely from Java:

class SpringInitializer extends WebApplicationInitializer {

    void onStartup(ServletContext container) {
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.getEnvironment().setActiveProfiles("profileName");
        rootContext.register(SpringConfiguration.class);
        container.addListener(new ContextLoaderListener(rootContext));
    }
}

Where SpringConfiguration class is annotated with @Configuration.