about spring boot how to disable web environment correctly

后端 未结 2 1381
南笙
南笙 2020-12-05 18:53

Spring boot non-web application, when start it has below error

Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWe         


        
相关标签:
2条回答
  • 2020-12-05 19:28

    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>    
    
    0 讨论(0)
  • 2020-12-05 19:37

    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

    0 讨论(0)
提交回复
热议问题