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]
然后我尝试了以下方式
new SpringApplication().setWebEnvironment(false);
然后开始它还有上面的错误。
然后尝试了
@SpringBootApplication(exclude={SpringDataWebAutoConfiguration.class})
但仍然有同样的错误。
最后,我尝试在application.properties
spring.main.web-environment=false
这次它有效。
为什么前两种方式不起作用?
答案 0 :(得分:18)
-web(false)/ setWebEnvironment(false)已弃用,而Web-Application-Type可用于指定
spring.main.web-application-type=NONE
# REACTIVE, SERVLET
@SpringBootApplication
public class SpringBootDisableWebEnvironmentApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(SpringBootDisableWebEnvironmentApplication.class)
.web(WebApplicationType.NONE) // .REACTIVE, .SERVLET
.run(args);
}
}
NONE
- 应用程序不应作为Web应用程序运行,也不应启动嵌入式Web服务器。REACTIVE
- 应用程序应作为响应式Web应用程序运行,并应启动嵌入式响应式Web服务器。SERVLET
- 应用程序应作为基于servlet的Web应用程序运行,并应启动嵌入式servlet Web服务器。
答案 1 :(得分:5)
此配置无效的原因是因为这是两个不同的实例:
new SpringApplication().setWebEnvironment(false);
SpringApplication.run(SpringBootDisableWebEnvironmentApplication.class, args);
您正在setWebEnvironment(false)
对象中停用new SpringApplication()
并在run()
上调用静态方法SpringApplication.run(...)
。
我想出了3种方法:
@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 ;)");
}
}
以下是完整的Project。
您无需在config下面排除:
@SpringBootApplication(exclude = {EmbeddedServletContainerAutoConfiguration.class,
WebMvcAutoConfiguration.class})
因为您的spring-boot-starter-web
pom.xml
依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
答案 2 :(得分:0)
public static void main(String[] args) {
SpringApplication(Application.class)
.setWebApplicationType(WebApplicationType.NONE)
.run(args);
}
是另一种方式,而不是使用 SpringApplicationBuilder
。