Весняна завантаження: неможливо запустити EmbeddedWebApplicationContext через відсутній EmbeddedServletContainerFactory bean


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

Як бачимо, основний метод містить коментований рядок. Я вже робив підручник, а саме цей: 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

Посібник із планування - це не веб-додаток, тож у вашому пом.xml ви, мабуть, мають деякі плісняві речі з посібника з REST? Якщо ви уважно дотримуєтесь інструкцій, це має працювати. Інша потенційна проблема щодо коду, який ви опублікували вище, полягає в тому, що ваш @EnableAutoConfigurationклас не використовується в контексті, лише як основний метод (який може не бути проблемою для керівництва з планування, але це, мабуть, для набору інших).


1
Я виконую всі підручники в одному проекті Eclipse, що закінчується одним гігантським пом. Я помістив його в окремий проект, використовуючи пом з підручника, і тепер він працює чудово. Спасибі за вашу допомогу! Що робити, якщо я хочу планувальник у весняній веб-програмі за допомогою цього API? Я не можу цього зробити?
Куміте

З джерела ви можете це зробити. Але тоді вам знадобляться всі залежності для Webapp.
Дейв Сайер

1
Але потім у мене є виняток, який ви можете побачити у відкритті потоку. Вибачте, я думаю, що мені чогось не вистачає. Чи слід публікувати тут "поганий" pom.xml?
Куміте

1
"Хороший" пом "матиме" весняний завантажувальний запуск-веб "(для зручності), або ще всі залежності, включені до стартера, перераховані окремо. Просто перевірте, чи є у вас. Також переконайтеся, що ви включили @EnableAutoConfigurationу свій SpringApplication(фрагмент коду, наведеного вище, не має).
Дейв Сайер

6
Працює чудово, я не можу вам подякувати достатньо. І для того, щоб він працював, мені довелося додати класи для запуску в об’єктний масив до методу запуску SpringApplication: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>.
Паша ГР

27

Я мав кілька класів додатків в одному проекті Spring Boot, який включив Інтернет, і хотів уникнути його налаштування веб-середовища для одного з них, тому я вручну налаштував його, як показано нижче:

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

ОНОВЛЕННЯ для весняного завантаження 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
Чудова відповідь! Це вирішило моє питання. Однак вона працювала в Intellij. Коли я створив банку за допомогою плагіна Maven shadow, був створений той самий classpath, щоб я не розумів, що сталося.
учень

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

На додаток до рішення Маркіза, поданого вище, я переконався, що вибрав правильну версію комбінації 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

Якщо ви упаковуєте його як одну банку, і це не веб-додаток, спробуйте завантажити контекст програми, як показано нижче.

@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> пакунок </phase>, а потім запустив додаток, як mvn clean package працював на мене.
hipokito

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>

У мене була така проблема, як ; Відсутність цієї залежності


Це виправляє мою проблему.
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: \ Користувачі \ YourUserName.m2 \ сховище


Для всіх, хто переглядає навчальний посібник PluralSight на Java Spring, це єдине рішення, яке працювало для мене!
Janac Meena

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

Я мав цей Виняток у наступній ситуації.

в моїй 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

У мене була подібна проблема, і проблема полягала у несправності файлу jar jar. У моєму випадку tomcat-embed-coreфайл банку було порушено. Тому я вийняв його з Maven repo та оновив його для завантаження знову.


] Будь ласка, використовуйте інструменти форматування для правильного редагування та форматування вашої відповіді.
Морзе

0

У моєму випадку це відбувається після виключення папки ресурсів із pomвикористання наступного коду.

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

Коментуючи цей код, почався мій код.


0

Іншою причиною цієї проблеми є пошкодження банок сховища 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 споживає теми кафки та кінцеву точку перевірки стану здоров’я для отримання вхідних гачків. Я витратив 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.