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

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

Ответ 1

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

Ответ 2

Сканирование @SpringBootApplication показывает, что оно включает в себя следующие аннотации:

@Configuration
@ComponentScan
@EnableAutoConfiguration

Таким образом, вы могли бы сделать это тоже:

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

Ответ 3

используйте это в своем 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>

Ответ 4

Попробуйте это

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

Ответ 5

Ошибка говорит о том, что приложение, которое вы пытаетесь запустить, не может создать экземпляр 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> 

Ответ 6

У меня было несколько классов приложений в одном проекте 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);
    }
}

Ответ 7

добавлять

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

Ответ 8

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

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

Ответ 9

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

@SpringBootApplication
public class AppStarter {

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

Ответ 10

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

Таким образом, решение будет заключаться в использовании строки, которую вы закомментировали:

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

Ответ 11

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

@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"), он переопределит параметры

Ответ 12

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

  • настройка 1

    $gradle clean bootRepackage

  • настройка 2

    $java -jar build/libs/demo.jar

Ответ 13

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

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

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

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

Ответ 14

Добавление зависимостей стартера загрузки spring зафиксировало мою ошибку.

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

Это необходимо, если вы хотите запустить tomcat как встроенный сервер.

Ответ 15

Проверьте, существует ли ваш pom.xml

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

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

Ответ 16

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

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

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

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

Ответ 17

Это должно быть вызвано проблемой зависимости, в общем, вам нужно проверить зависимость.

Ответ 18

Проблема в этом классе:

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

Ответ 19

Clear repository - одно из возможных решений.

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

C:\Users\YourUserName.m2\репозиторий

Ответ 20

Проблема заключается в исключении стартера tomcat, я попытался исключить его и использовать vert.x, поэтому, когда я интегрирую wit 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>

Ответ 21

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

в моем 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>

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

Ответ 22

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

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

Ответ 23

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

Ответ 24

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

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

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

Ответ 25

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

mvn dependency:purge-local-repository

Ответ 26

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

@SpringBootApplication открытый класс LoginSecurityAppApplication {

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

}