Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Boot Programmatically setting profiles

How to set active profile in spring boot Application. This application will be deployed in stand alone Tomcat.

I have 2 property files application-{profile}.properties.

My Application class

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

if I run the app with embedded tomcat the dev profile is set as active and it works fine. But when I deploy in stand alone tomcat. It does not work.

I tried to set active profile in configure method. but i get null pointer exception, when i get the environment from the context.

Any help on how to set the active profile.

like image 297
Mukun Avatar asked Jul 07 '15 11:07

Mukun


Video Answer


4 Answers

You can set additional profiles on start up:

   SpringApplication springApp = new SpringApplication(Main.class);
   springApp.setAdditionalProfiles("profile1", "profile2");
   springApp.run(args);
like image 62
Alex Stanovsky Avatar answered Oct 19 '22 10:10

Alex Stanovsky


I also had the same problem and after struggling for half a day I ended up with this:

    @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);
        }
    }
like image 22
falcon Avatar answered Oct 19 '22 08:10

falcon


Another way of doing it in Spring Boot 2 is by using 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);
    }
}
like image 12
nyxz Avatar answered Oct 19 '22 10:10

nyxz


Instead of activating the profile dynamically, you can put the profiles as vm-arguments in the catalina.sh

CATALINA_OPTS="-Dspring.profiles.active=dev"
like image 3
Qkyrie Avatar answered Oct 19 '22 08:10

Qkyrie