Spring Boot: невозможно запустить EmbeddedWebApplicationContext из-за отсутствия компонента EmbeddedServletContainerFactory


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/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 как приложение. Может ли кто-нибудь помочь мне?

Ответы:


66

Руководство по планированию не является веб-приложением, поэтому, возможно, в вашем файле pom.xml есть руководство по REST? Если вы будете внимательно следовать инструкциям, это должно сработать. Другая потенциальная проблема с кодом, который вы разместили выше, заключается в том, что ваш @EnableAutoConfigurationкласс не используется в контексте, а только как основной метод (что, возможно, не является проблемой для руководства по планированию, но, вероятно, для многих других).


1
Я делаю все учебники в одном проекте Eclipse, заканчивающемся одним гигантским помом. Я поместил его в отдельный проект, используя pom из учебника, и теперь он работает отлично. Спасибо за вашу помощь! Что если я хочу использовать планировщик в веб-приложении Spring с использованием этого API? Я не могу этого сделать?
Kumite

Из источника вы можете сделать это. Но тогда вам понадобятся все зависимости для веб-приложения.
Дейв Сайер

1
Но потом я получаю исключение, которое вы можете увидеть в открытии темы. Извините, я думаю, что что-то упустил. Должен ли я опубликовать «плохой» pom.xml здесь?
Kumite

1
«Хороший» pom будет иметь «spring-boot-starter-web» (для удобства) или все зависимости, включенные в стартер, перечисленные индивидуально. Просто проверьте, что они у вас есть. Также убедитесь, что вы включили @EnableAutoConfigurationв свой SpringApplication(фрагмент кода выше не делает).
Дейв Сайер

6
Работает отлично, я не могу отблагодарить вас достаточно. И чтобы это заработало, мне пришлось добавить классы для запуска в массиве Object в метод runApplication Spring: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);
    }
}

ОБНОВЛЕНИЕ для Spring Boot 2 и выше:

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

23

Попробуй это

@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
Отличный ответ! Это решило мою проблему. Однако он работал в интеллигенции. Когда я создал банку с помощью плагина maven shade, был создан тот же путь к классам, поэтому я не совсем понимаю, что произошло.
Ученик

14

Добавить

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

8

если вы столкнулись с этим исключением при использовании intellij и пытаетесь запустить приложение с помощью runкнопки. Попробуйте запустить приложение из командной строки. Например, убедитесь, что вы находитесь в правильном каталоге (каталог с вашим pom-файлом), предполагая, что это springbootприложение, которое запустило mvn spring-boot:runменя.

Кроме того, я также видел эту ошибку, когда ваше весеннее приложение зависит от другого приложения. В этом случае мне пришлось сначала запустить другое приложение, а затем запустить.


1
Перезапуск IntelliJ (Ultimate 2016.3 здесь) исправил это для меня
mangusbrother

В дополнение к приведенному выше решению Marquis, я убедился, что выбрал правильную версию комбинации mvn и jdk для запускаmvn spring-boot:run
lnarasimhan

6

Добавление аннотации @SpringBootApplicationДо того, как начальный класс исправил эту проблему для меня (поэтому, по сути, это сообщение об ошибке может означать «у вас нет @SpringBootApplicationотмеченного класса где-либо, вам нужен хотя бы один)

@SpringBootApplication
public class AppStarter {

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

4

У меня были похожие проблемы, когда основной метод находится в другом классе, чем тот, который был передан SpringApplcation.run ()

Поэтому решение было бы использовать закомментированную строку:

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

3

Если вы упаковали его как единый jar, и это не веб-приложение, попробуйте загрузить контекст приложения, как показано ниже.

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

Или используйте плагин ниже, чтобы упаковать его в одну банку

             <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 помогли мне.
Хипокито

2

Если вы успешно запустили его с помощью командной строки gradle bootRun, упаковав его с командной строкой gradle jarв jar-файл, чтобы запустить его с командной строкой java -jar build/libs/demo.jar, к сожалению, это не удалось с исключением: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory beanв этом случае вам нужно использовать bootRepackageплагин gradle spring-bootдля генерации специального бегущая банка.

  • настройка 1

    $ gradle clean bootRepackage

  • настройка 2

    $ java -jar build / libs / demo.jar


Понятия не имею почему, но gradle clean bootRepackage помог мне. Раньше я вручную очищал весь кеш и создавал папку.
Андрей Абрамов

2

SpringApplicationБудет пытаться создать правильный тип ApplicationContextот вашего имени. По умолчанию, AnnotationConfigApplicationContextили AnnotationConfigEmbeddedWebApplicationContextбудет использоваться, в зависимости от того , вы разрабатываете веб - приложение или нет.

Алгоритм, используемый для определения «веб-среды», довольно прост (основан на наличии нескольких классов). Вы можете использовать, setWebEnvironment(boolean webEnvironment)если вам нужно переопределить значение по умолчанию.

Также возможно получить полный контроль над ApplicationContextтипом, который будет использоваться при вызове setApplicationContextClass(…​).

[Подсказка] Часто желательно вызывать setWebEnvironment(false)при использовании SpringApplicationв тесте JUnit.


Как вы используете setWebEnvironment при создании приложения через SpringApplication.run(Application.class, args);?
tgdavies

@tgdavies смотрите мой ответ выше, вы можете использоватьSpringApplicationBuilder
Роберт Хант

2

Добавление зависимости запуска пружины при загрузке исправило мою ошибку.

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

У меня была такая проблема this Из-за отсутствия этой зависимости


Это решает мою проблему.
lenhhoxung

1

В моем случае мы добавили аннотацию @Profile заново , чтобы игнорировать класс TestApplication в рабочем режиме и класс Application в тестовом режиме.

К сожалению, мы забыли добавить следующую строку в файлы application.properties:

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

Без этих настроек ни один профиль не был загружен, что вызвало не очень большую поговорку Spring Error.


Я хотел бы добавить, что вы также можете получить эту ошибку, если вы предоставите аннотацию @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

Очистить хранилище является одним из возможных решений.

Windows -> удалить все подпапки в репозитории maven:

C: \ Users \ YourUserName.m2 \ хранилище


Любой, кто следует учебнику по PluralSight по Java Spring, это единственное решение, которое сработало для меня!
Янак Мина

1

Я застрял с той же проблемой. Так как я не определил Main.class и следующие аннотации в Spring-Boot с использованием Maven:

@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

У меня было это исключение в следующей ситуации.

в моем ПОМе были свойства:

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

и имя и путь моего класса приложения ("start-class") были неправильными.


0

У меня была похожая проблема, и проблема была в испорченном файле JAV. В моем случае tomcat-embed-coreфайл jar был сломан. Поэтому я удалил его из репозитория Maven и обновил, чтобы загрузить снова.


] Пожалуйста, используйте инструменты форматирования, чтобы правильно редактировать и форматировать свой ответ.
Морс

0

В моем случае это происходит после исключения папки ресурсов из pomследующего кода.

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

Комментируя этот код начал мой код.


0

Другой причиной этой проблемы является повреждение jav-файлов репозитория maven, поэтому вы можете использовать следующую команду для решения проблемы:

mvn dependency:purge-local-repository

0

Возможно, вы пропустили @SpringBootApplication в своем классе начальной загрузки.

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}

0

Я использую gradle, встречается, кажется, проблема, когда у меня команда LineRunner потребляет темы kafka и конечную точку проверки работоспособности для получения входящих ловушек. Я потратил 12 часов, чтобы выяснить это, и наконец обнаружил, что использовал mybatis-spring-boot-starter с spring-boot-starter-web, и у них есть некоторые конфликты. Позднее я непосредственно представил mybatis-spring, mybatis и spring-jdbc, а не mybatis-spring-boot-starter, и программа работала хорошо.

надеюсь это поможет

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.