关于spring boot如何正确禁用web环境

zhu*_*wei 9 spring-boot

Spring启动非Web应用程序,启动时有以下错误

Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:185) ~[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
Run Code Online (Sandbox Code Playgroud)

然后我尝试了下面的方式

new SpringApplication().setWebEnvironment(false);
Run Code Online (Sandbox Code Playgroud)

然后开始它仍然有上面的错误.

然后试过

@SpringBootApplication(exclude={SpringDataWebAutoConfiguration.class})
Run Code Online (Sandbox Code Playgroud)

但仍然有同样的错误.

最后我尝试添加以下配置 application.properties

spring.main.web-environment=false
Run Code Online (Sandbox Code Playgroud)

这次它有效.

为什么前两种方式不起作用?

Nar*_*mha 27

从Spring Boot 2.0开始

不推荐使用-web(false)/ setWebEnvironment(false),而是可以使用Web-Application-Type来指定


其中WebApplicationType:

  • NONE - 应用程序不应作为Web应用程序运行,也不应启动嵌入式Web服务器.
  • REACTIVE - 应用程序应作为响应式Web应用程序运行,并应启动嵌入式响应式Web服务器.
  • SERVLET - 应用程序应作为基于servlet的Web应用程序运行,并应启动嵌入式servlet Web服务器.

礼貌:另一个SO回答


San*_*wat 5

这个答案已经过时了。请注意Spring Boot 2.0的其他答案

Spring Boot 1.x的原始答案:

此配置不起作用的原因是,这是两个不同的实例:

new SpringApplication().setWebEnvironment(false); 
SpringApplication.run(SpringBootDisableWebEnvironmentApplication.class, args);
Run Code Online (Sandbox Code Playgroud)

要禁用setWebEnvironment(false)new SpringApplication()对象,并调用静态方法run()SpringApplication.run(...)是不同的。

我想出了三种方法来做到这一点:

@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 ;)");
    }
}
Run Code Online (Sandbox Code Playgroud)

这是完整的工作项目

而且您不需要排除以下配置:

@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class, 
                              WebMvcAutoConfiguration.class})
Run Code Online (Sandbox Code Playgroud)

因为你没有spring-boot-starter-web依赖性pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>    
Run Code Online (Sandbox Code Playgroud)

  • 这个答案已经过时了。请注意 Spring Boot 2.0 的其他答案 (2认同)