about spring boot how to disable web environment correctly

This answer is obsolete. Please note the other answer for Spring Boot 2.0

Original answer for Spring Boot 1.x:

The reason this config is not working because these are two different instances:

new SpringApplication().setWebEnvironment(false); 
SpringApplication.run(SpringBootDisableWebEnvironmentApplication.class, args);

You are disabling setWebEnvironment(false) in new SpringApplication() object and calling static method run() on SpringApplication.run(...) which is different one.

I figured out 3 ways to do this:

@SpringBootApplication
public class SpringBootDisableWebEnvironmentApplication implements CommandLineRunner{


    public static void main(String[] args) throws Exception {

//      Method#1: Using SpringApplicationBuilder.

        SpringApplication springApplication = 
                new SpringApplicationBuilder()
                .sources(SpringBootDisableWebEnvironmentApplication.class)
                .web(false)
                .build();

        springApplication.run(args);

//--------------------------------------------------------      

//      Method#2: Using SpringBootDisableWebEnvironmentApplication.     

//      SpringBootDisableWebEnvironmentApplication springBootDisableWebEnvironmentApplication = 
//              new SpringBootDisableWebEnvironmentApplication();
//      springBootDisableWebEnvironmentApplication.run(args);

//--------------------------------------------------------      

//      Method#3: Using SpringApplication().

//      SpringApplication springApplication = new SpringApplication();
//      springApplication.setWebEnvironment(false);
//      
//      Set<Object> sources = new HashSet<>();
//      sources.add(SpringBootDisableWebEnvironmentApplication.class);
//      springApplication.setSources(sources);
//      springApplication.run(args);

//--------------------------------------------------------  

    }

    @Override
    public void run(String... arg0) throws Exception {
        System.out.println("Hello, Spring Boot gives many options ;)");
    }
}

Here is the complete working Project.

And you don't need to exclude below config:

@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class, 
                              WebMvcAutoConfiguration.class})

Because you don't have spring-boot-starter-web dependency in your pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>    

Starting from Spring Boot 2.0

-web(false)/setWebEnvironment(false) is deprecated and instead Web-Application-Type can be used to specify

  • Application Properties

    spring.main.web-application-type=NONE 
    # REACTIVE, SERVLET
    
  • or SpringApplicationBuilder

    @SpringBootApplication
    public class SpringBootDisableWebEnvironmentApplication {
    
        public static void main(String[] args) {
            new SpringApplicationBuilder(SpringBootDisableWebEnvironmentApplication.class)
                .web(WebApplicationType.NONE) // .REACTIVE, .SERVLET
                .run(args);
       }
    }
    

Where WebApplicationType:

  • NONE - The application should not run as a web application and should not start an embedded web server.
  • REACTIVE - The application should run as a reactive web application and should start an embedded reactive web server.
  • SERVLET - The application should run as a servlet-based web application and should start an embedded servlet web server.

Courtesy: Another SO Answer


As already noted in other answers the simplest solution is to add a property:

  • spring.main.web-application-type=NONE for Spring-boot 2.x
  • spring.main.web-environment=false for Spring-boot 1.x

But the simplest solution is NOT the best one, it's just quick&dirty. Spring-boot has a lot of autoconfigurations that are triggered by the content of your classpath, so you probably have some unnecessary web-related dependency in your app.

I had a Spring-batch application that was giving

Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

It was caused by the presence of javax.servlet-api in my POM. I removed it and the problem disappeared.

Tags:

Spring Boot