Spring Boot:由于缺少EmbeddedServletContainerFactory bean而无法启动EmbeddedWebApplicationContext


173

我对Spring完全陌生,并开始从该站点制作官方指南:https//spring.io/guides

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

我收到以下异常:

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] .c.l.ClasspathLoggingApplicationListener : 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(ScheduledTasks.class, args);
    }
}

如您所见,main方法包含一个注释行。我已经完成了一个教程,即本教程:https : //spring.io/guides/gs/using-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的主程序作为应用程序运行。有人可以帮我吗?

Answers:


66

调度指南不是Web应用程序,因此REST指南中的pom.xml中可能包含一些发霉的东西?如果您严格按照说明进行操作,那么它应该可以工作。您上面发布的代码的另一个潜在问题是您的@EnableAutoConfiguration类不在上下文中使用,而只是作为主要方法使用(对于调度指南来说这可能不是问题,但对于其他很多问题而言)。


1
我将所有教程都集成到一个Eclipse项目中,并以一个巨型pom结尾。我使用教程中的pom将其放在一个单独的项目中,现在它可以完美运行。谢谢你的帮助!如果我想要使用此API的Spring webapp中的调度程序怎么办?我做不到
Kumite

从源头上讲,您可以做到这一点。但是,那么您将需要Web应用程序的所有依赖项。
Dave Syer 2014年

1
但是最后我遇到了异常,您可以在线程打开处看到该异常。抱歉,我想我缺少了一些东西。我应该在这里发布“坏”的pom.xml吗?
Kumite

1
一个“好”的pom将具有“ spring-boot-starter-web”(为方便起见),否则将单独列出该启动器中包含的所有依赖项。只需检查您是否有它们。另外,还要确保你包括@EnableAutoConfiguration你的SpringApplication(代码片段上面并没有)。
Dave Syer 2014年

6
效果很好,我感激不尽。为了使其工作,我必须将要在Object数组中运行的类添加到SpringApplication的run方法中:SpringApplication.run(new Object[]{Application.class, ScheduledTasks.class}, args);
Kumite

48

@SpringBootApplication包含以下注释的节目扫描:

@Configuration
@ComponentScan
@EnableAutoConfiguration

因此,您也可以这样做:

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

29

在您的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>

1
加2罐也对我有用。我必须同时使用两者
Fafore Tunde

1
@FaforeTunde这不是一个好兆头,请查看您的依赖树,并检查是否在其中使用了<scope>标记。
Pasha GR

27

我在一个包含了网络启动功能的Spring Boot项目中有多个应用程序类,并希望避免它为其中之一配置网络环境,因此我按如下方式手动配置它:

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

UPDATE春季启动2及以上:

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

22

试试这个

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

20

该错误表明您尝试运行的应用程序无法实例化apache tomcat实例。确保您正在使用tomcat运行该应用程序。

如果在检查所有依赖项后遇到相同的问题,请尝试在配置类中添加以下内容

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

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

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

2
好答案!它解决了我的问题。但是它正在intellij中工作。当我使用maven shade插件创建jar时,创建了相同的类路径,所以我不太了解发生了什么。
学徒

14

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

8

如果在使用intellij时遇到此异常,并且您尝试使用run按钮启动应用程序。请尝试从命令行启动应用程序。例如,假设这是springboot应用程序运行,请确保您位于正确的目录(包含pom文件的目录)中mvn spring-boot:run对我来说很成功。

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


1
重新启动IntelliJ(此处为最终版本2016.3)为我修复了它
mangusbrother

除了上述侯爵提供的解决方案之外,我还确定我选择了mvn和jdk组合的正确版本来运行mvn spring-boot:run
lnarasimhan

6

添加注释@SpringBootApplication在starter类为我解决此问题之前(因此,实质上,此错误消息可能意味着“您在@SpringBootApplication任何地方都没有标记的类,您至少需要一个)

@SpringBootApplication
public class AppStarter {

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

4

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

因此解决方案是使用您注释掉的行:

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

3

如果您将其打包为单个jar,并且不是Web应用程序,请尝试按以下方式加载应用程序上下文。

@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>

您可以通过使用以下命令运行来指定外部配置

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

请注意,如果您将属性作为参数传递,则不包含@PropertySource("classpath:test.properties")它会覆盖参数


添加spring-boot-maven-plugin和<phase> package </ phase>,然后将应用程序作为mvn clean package运行对我来说很有效。
hipokito

2

如果使用命令行成功运行它gradle bootRun,同时使用命令行将其打包gradle jar到jar文件以便通过命令行运行,那么java -jar build/libs/demo.jar不幸的是,它以Exception:失败Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean,在这种情况下,您需要使用bootRepackagegradle插件任务spring-boot来生成特殊的可运行的罐子。

  • 设置1

    $ gradle clean boot重新打包

  • 设置2

    $ java -jar build / libs / demo.jar


我不知道为什么,但是gradle clean bootRepackage 帮助了我。以前,我已经手动清理了所有缓存和构建文件夹。
安德里·阿布拉莫夫

2

A SpringApplication会尝试ApplicationContext代表您创建正确的类型。默认情况下,一个AnnotationConfigApplicationContextAnnotationConfigEmbeddedWebApplicationContext将使用,这取决于您是否正在开发Web应用程序。

用于确定“网络环境”的算法非常简单(基于几个类的存在)。setWebEnvironment(boolean webEnvironment)如果需要覆盖默认值,则可以使用。

也可以完全控制ApplicationContext将通过调用使用的类型setApplicationContextClass(…​)

[提示] 在JUnit测试中setWebEnvironment(false)使用时通常需要调用SpringApplication


通过创建应用程序时如何使用setWebEnvironment SpringApplication.run(Application.class, args);
tgdavies 16-10-18

@tgdavies请参阅上面的答案,您可以使用SpringApplicationBuilder
罗伯特·亨特

2

添加spring boot starter依赖关系修复了我的错误。

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

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


2

检查您的pom.xml是否存在

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

我遇到了这样的问题;因为缺少这种依赖


这解决了我的问题。
lenhhoxung

1

在我的情况下,我们新添加了@Profile批注,以便在生产模式下忽略TestApplication类,在测试模式下忽略Application类。

不幸的是,我们忘记将以下行添加到application.properties文件中:

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

如果没有这些配置,则不会加载任何配置文件,这会导致说Spring错误。


我想补充一点,如果同时提供@Profile批注并将配置文件传递给jvm,也会出现此错误。
苗条的

1

这应该是由依赖性问题引起的,通常,您需要检查依赖性。


1

问题在这个班级:

@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);
    }
}


1

我遇到了同样的问题。由于我没有使用Maven在Spring-Boot中定义Main.class和以下注释:

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

0

问题是排除了启动器tomcat,我尝试排除它并使用vert.x,因此当我与Spring Admin集成时,出现了问题

<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>

0

在以下情况下,我遇到了此异常。

在我的POM中是属性:

<properties>
    <java.version>1.8</java.version>
    <!-- The main class to start by executing java -jar -->
    <start-class>com.scmaer.java.microservice.Application</start-class>
    <cxf.version>3.1.5</cxf.version>
    <olingo.version>2.0.10</olingo.version>
    <spring.boot.version>1.4.7.RELEASE</spring.boot.version>
    <spring.boot.plugin.version>1.5.8.RELEASE</spring.boot.plugin.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <skipTests>false</skipTests>
</properties>

并且我的应用程序类(“开始类”)的名称和路径错误。


0

我有一个类似的问题,问题是损坏的Maven存储库文件。就我而言,tomcat-embed-corejar文件已损坏。因此,我将其从Maven存储库中删除,并刷新以再次下载。


]请使用格式化工具来正确编辑和格式化答案。
Morse

0

就我而言,它是在pom使用以下代码从资源文件夹中排除之后发生的。

<resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <excludes>
                <exclude>*/*.properties</exclude>
            </excludes>
        </resource>
</resources>

注释此代码开始我的代码。


0

导致此问题的另一个原因是Maven存储库jar损坏,因此您可以使用以下命令来解决该问题:

mvn dependency:purge-local-repository

0

可能您在Spring Boot Starter类中缺少@SpringBootApplication

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}

0

我正在使用gradle,当我有一个CommandLineRunner消耗kafka主题和用于接收传入钩子的运行状况检查端点时,遇到了似乎存在的问题。我花了12个小时来弄清楚,终于发现我将mybatis-spring-boot-starter与spring-boot-starter-web一起使用,它们之间存在一些冲突。后来我直接介绍了mybatis-spring,mybatis和spring-jdbc而不是mybatis-spring-boot-starter,该程序运行良好。

希望这可以帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.