Spring Boot:由于缺lessEmbeddedServletContainerFactory bean,无法启动EmbeddedWebApplicationContext

我对Spring很陌生,开始从这个网站上做官方指南: https : //spring.io/guides

我想要做这个指南: https : //spring.io/guides/gs/scheduling-tasks/

我得到以下exception:

2014-02-14 16:25:21.614 INFO 9032 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.scheduling.annotation.SchedulingConfiguration' of type [class org.springframework.scheduling.annotation.SchedulingConfiguration$$EnhancerByCGLIB$$5b48d763] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2014-02-14 16:25:21.638 INFO 9032 --- [ main] .clClasspathLoggingApplicationListener : Application failed to start with classpath: [file:/C:/work/Spring/SpringTutorial/target/classes/, file:/C:/work/apache-maven-3.0.3/repo/javax/servlet/javax.servlet-api/3.0.1/javax.servlet-api-3.0.1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot-starter/1.0.0.RC1/spring-boot-starter-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot/1.0.0.RC1/spring-boot-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-core/4.0.0.RELEASE/spring-core-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-context/4.0.0.RELEASE/spring-context-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot-autoconfigure/1.0.0.RC1/spring-boot-autoconfigure-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot-starter-logging/1.0.0.RC1/spring-boot-starter-logging-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/slf4j/jcl-over-slf4j/1.7.5/jcl-over-slf4j-1.7.5.jar, file:/C:/work/apache-maven-3.0.3/repo/org/slf4j/slf4j-api/1.7.5/slf4j-api-1.7.5.jar, file:/C:/work/apache-maven-3.0.3/repo/org/slf4j/jul-to-slf4j/1.7.5/jul-to-slf4j-1.7.5.jar, file:/C:/work/apache-maven-3.0.3/repo/org/slf4j/log4j-over-slf4j/1.7.5/log4j-over-slf4j-1.7.5.jar, file:/C:/work/apache-maven-3.0.3/repo/ch/qos/logback/logback-classic/1.0.13/logback-classic-1.0.13.jar, file:/C:/work/apache-maven-3.0.3/repo/ch/qos/logback/logback-core/1.0.13/logback-core-1.0.13.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot-starter-web/1.0.0.RC1/spring-boot-starter-web-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/boot/spring-boot-starter-tomcat/1.0.0.RC1/spring-boot-starter-tomcat-1.0.0.RC1.jar, file:/C:/work/apache-maven-3.0.3/repo/org/apache/tomcat/embed/tomcat-embed-core/7.0.47/tomcat-embed-core-7.0.47.jar, file:/C:/work/apache-maven-3.0.3/repo/org/apache/tomcat/embed/tomcat-embed-logging-juli/7.0.47/tomcat-embed-logging-juli-7.0.47.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-web/4.0.0.RELEASE/spring-web-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/aopalliance/aopalliance/1.0/aopalliance-1.0.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-aop/4.0.0.RELEASE/spring-aop-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-beans/4.0.0.RELEASE/spring-beans-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-webmvc/4.0.0.RELEASE/spring-webmvc-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/org/springframework/spring-expression/4.0.0.RELEASE/spring-expression-4.0.0.RELEASE.jar, file:/C:/work/apache-maven-3.0.3/repo/com/fasterxml/jackson/core/jackson-databind/2.3.1/jackson-databind-2.3.1.jar, file:/C:/work/apache-maven-3.0.3/repo/com/fasterxml/jackson/core/jackson-annotations/2.3.0/jackson-annotations-2.3.0.jar, file:/C:/work/apache-maven-3.0.3/repo/com/fasterxml/jackson/core/jackson-core/2.3.1/jackson-core-2.3.1.jar, file:/C:/work/apache-maven-3.0.3/repo/commons-lang/commons-lang/2.2/commons-lang-2.2.jar] Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:140) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:124) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:658) at org.springframework.boot.SpringApplication.run(SpringApplication.java:355) at org.springframework.boot.SpringApplication.run(SpringApplication.java:920) at org.springframework.boot.SpringApplication.run(SpringApplication.java:909) at hu.kumite.Application.main(Application.java:17) 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:190) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:163) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137) ... 7 more 

应用程序初学者类是这样的:

 @ComponentScan @EnableAutoConfiguration public class Application { public static void main(String[] args) { //SpringApplication.run(Application.class, args); SpringApplication.run(ScheduledTasks.class, args); } } 

正如你所看到的,主要的方法包含一个注释行。 我已经做了一个教程,即这一个: https : //spring.io/guides/gs/consuming-rest/它已经开始运行。 但我无法运行ScheduledTasks应用程序,它是以下内容:

 @EnableScheduling public class ScheduledTasks { private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); @Scheduled(fixedRate = 5000) public void reportCurrentTime() { System.out.println("The time is now " + dateFormat.format(new Date())); } } 

我使用Eclipse并运行Application.java的main作为应用程序。 有人可以帮我吗?

调度指南不是一个Web应用程序,所以你可能在REST指南的pom.xml中有一些模糊的东西? 如果你按照说明密切它应该工作。 您上面发布的代码的另一个潜在问题是您的@EnableAutoConfiguration类不在上下文中使用,只作为主要方法(对于调度指南来说这可能不是问题,但可能适用于其他许多问题)。

对@SpringBootApplication的扫描显示它包含以下注释:

 @Configuration @ComponentScan @EnableAutoConfiguration 

所以你也可以这样做:

 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(ScheduledTasks.class, args); } } 

尝试这个

 @Configuration @ComponentScan @EnableAutoConfiguration public class Application { public static void main(String[] args) { SpringApplication.run(ScheduledTasks.class, args); } } 

在你的pom.xml中使用这个:

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

或者这个:

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

我在一个Spring Boot项目中有多个应用程序类,其中包括Web开始,并希望避免它为其中之一configurationWeb环境,所以我手动configuration它如下:

 @SpringBootApplication public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(false).run(args); } } 

这个错误提示你正在运行的应用程序不能实例化一个Apache Tomcat的实例。 确保你正在用tomcat运行应用程序。

如果在检查完所有依赖关系后遇到同样的问题,请尝试在configuration类中添加以下内容

  @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); return factory; } 

如果您使用的是tomcat的外部实例(尤其是intelij),则问题可能是IDE尝试启动embedded式tomcat。 在这种情况下,从pom.xml中删除以下内容,然后使用“编辑configuration”向导configuration外部的tomcat。

  <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> 

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

当主方法与传递给SpringApplcation.run()的类不同时,我遇到了类似的问题。

所以解决办法是使用你已经注释过的行:

 public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

如果在使用intellij时遇到此exception,并且您尝试使用runbutton启动应用程序。 尝试从命令行启动应用程序。 例如,确保你是在正确的目录(你的pom文件的目录),假设这是一个mvn spring-boot:run应用程序运行mvn spring-boot:run这个对我来说做的伎俩。

另外我也看到这个错误发生在你的spring应用程序依赖于另一个应用程序。 在这种情况下,我必须先启动另一个应用程序然后运行。

如果您使用命令行gradle bootRun成功运行它,而使用命令行gradle jargradle jar到jar文件中,以便使用命令行java -jar build/libs/demo.jar运行它,不幸的是,它失败,exception: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean ,请Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean ,在这种情况下,需要使用gradle plugin spring-boot任务bootRepackage生成特殊的runnable jar。

  • 设置1

    $ gradle clean bootRepackage

  • 设置2

    $ java -jar build / libs / demo.jar

如果你把它打包成一个单独的jar文件,而且它不是web应用,请尝试加载app context,如下所示。

 @SpringBootApplication ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class); 

或者使用下面的插件作为一个单独的jar打包

  <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> 

您可以使用下面的命令来指定外部configuration

 java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties 

/ http://docs.spring.io/spring-boot/docs/current/reference/htmlboot-features-external-config.html#boot-features-external-config-application-property-files

请注意,如果您将属性作为parameter passing,那么不要包含@PropertySource("classpath:test.properties") ,它将覆盖参数

添加注解@SpringBootApplication在初学者类为我解决这个问题之前。

 @SpringBootApplication public class AppStarter { public static void main(String[] args) { SpringApplication.run(AppStarter.class, args); } } 

SpringApplication将会尝试为你创build正确types的ApplicationContext 。 默认情况下,将使用AnnotationConfigApplicationContextAnnotationConfigEmbeddedWebApplicationContext ,具体取决于您是否正在开发Web应用程序。

用于确定“Web环境”的algorithm相当简单(基于less数类的存在)。 如果您需要覆盖默认setWebEnvironment(boolean webEnvironment)可以使用setWebEnvironment(boolean webEnvironment)

也可以通过调用setApplicationContextClass(…​)来完全控制ApplicationContexttypes。

[Tip]在JUnittesting中使用SpringApplication时,通常需要调用setWebEnvironment(false)

添加spring引导启动器依赖项修复了我的错误。

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

如果要将tomcat作为embedded式服务器启动,则这是必需的。

这应该是由依赖性问题引起的,一般来说,你需要检查依赖关系。

检查你的pom.xml是否存在

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

我有这样的问题,因为缺乏这种依赖

在我的情况下,我们新增了@Profile注释 ,以便忽略生产模式下的TestApplication类和testing模式下的Application类。

不幸的是,我们忘了在application.properties文件中添加以下代码:

 spring.profiles.active=test or spring.profiles.active=production 

没有这些configuration没有configuration文件被加载,导致不太多说spring错误。

它在这个类中的问题:

 @ComponentScan @EnableAutoConfiguration public class Application { public static void main(String[] args) { //SpringApplication.run(Application.class, args); SpringApplication.run(ScheduledTasks.class, args); } } 

启动您的应用程序的正确方法是:

 @SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 

清除仓库是一个可能的解决scheme

Windows – >删除Maven仓库中的所有子文件夹:

C:\ Users \用户YourUserName.m2 \库

问题是排除了启动tomcat,我试着排除它,并使用vert.x,所以当我整合智能Springpipe理员,开始的问题

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