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,并且您尝试使用run
button启动应用程序。 尝试从命令行启动应用程序。 例如,确保你是在正确的目录(你的pom文件的目录),假设这是一个mvn spring-boot:run
应用程序运行mvn spring-boot:run
这个对我来说做的伎俩。
另外我也看到这个错误发生在你的spring应用程序依赖于另一个应用程序。 在这种情况下,我必须先启动另一个应用程序然后运行。
如果您使用命令行gradle bootRun
成功运行它,而使用命令行gradle jar
将gradle 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
请注意,如果您将属性作为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
。 默认情况下,将使用AnnotationConfigApplicationContext
或AnnotationConfigEmbeddedWebApplicationContext
,具体取决于您是否正在开发Web应用程序。
用于确定“Web环境”的algorithm相当简单(基于less数类的存在)。 如果您需要覆盖默认setWebEnvironment(boolean webEnvironment)
可以使用setWebEnvironment(boolean webEnvironment)
。
也可以通过调用setApplicationContextClass(…)
来完全控制ApplicationContext
types。
[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>