Spring Boot: nie można uruchomić EmbeddedWebApplicationContext z powodu braku komponentu bean EmbeddedServletContainerFactory

173

Jestem zupełnie nowy w Spring i zacząłem pisać oficjalne przewodniki z tej strony: https://spring.io/guides

Chciałbym zrobić ten przewodnik: https://spring.io/guides/gs/scheduling-tasks/

Otrzymuję następujący wyjątek:

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

Oto klasa startowa aplikacji:

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

Jak widać, główna metoda zawiera skomentowaną linię. Zrobiłem już samouczek, a mianowicie ten: https://spring.io/guides/gs/consuming-rest/ Działa. Ale nie mogę uruchomić aplikacji ScheduledTasks, która jest następująca:

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

Używam Eclipse i uruchamiam plik Application.java jako aplikację. Czy ktoś mógłby mi pomóc?

Kumite
źródło

Odpowiedzi:

66

Przewodnik planowania nie jest aplikacją internetową, więc prawdopodobnie masz jakieś spleśniałe rzeczy w swoim pom.xml z przewodnika REST? Jeśli będziesz ściśle przestrzegać instrukcji, powinno działać. Innym potencjalnym problemem związanym z kodem, który opublikowałeś powyżej, jest to, że twoja @EnableAutoConfigurationklasa nie jest używana w kontekście, tylko jako główna metoda (co może nie stanowić problemu dla przewodnika planowania, ale prawdopodobnie dotyczy wielu innych).

Dave Syer
źródło
1
Robię wszystkie samouczki w jednym projekcie Eclipse, kończąc na jednym gigantycznym pompie. Umieściłem to w osobnym projekcie używając pom z tutoriala i teraz działa idealnie. Dzięki za pomoc! A jeśli chcę mieć harmonogram w aplikacji internetowej Spring korzystającej z tego interfejsu API? Nie mogę tego zrobić?
Kumite,
Ze źródła możesz to zrobić. Ale wtedy potrzebne byłyby wszystkie zależności dla aplikacji internetowej.
Dave Syer
1
Ale kończy się na tym, że mam wyjątek, który można zobaczyć w otworze wątku. Przepraszam, chyba czegoś brakuje. Czy powinienem zamieścić tutaj „zły” pom.xml?
Kumite,
1
„Dobry” pom miałby „spring-boot-starter-web” (dla wygody) lub wszystkie zależności zawarte w starterze wymienione indywidualnie. Po prostu sprawdź, czy je masz. Upewnij się również, że @EnableAutoConfigurationw swoim SpringApplication(powyższy fragment kodu nie zawiera).
Dave Syer,
6
Działa idealnie, nie mogę ci wystarczająco podziękować. Aby to zadziałało, musiałem dodać klasy do uruchomienia w tablicy Object do metody uruchamiania SpringApplication:SpringApplication.run(new Object[]{Application.class, ScheduledTasks.class}, args);
Kumite,
48

Skan @SpringBootApplicationprogramu, który zawiera następujące adnotacje:

@Configuration
@ComponentScan
@EnableAutoConfiguration

Więc możesz to zrobić:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
       SpringApplication.run(ScheduledTasks.class, args);
    }
}
HClark
źródło
29

użyj tego w swoim pom.xml:

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

albo ten :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
Pasha GR
źródło
1
Dodanie 2 słoików też mi pomogło. Musiałem jednak użyć obu
Fafore Tunde
1
@FaforeTunde to nie jest dobry znak, spójrz na swoje drzewo zależności i sprawdź, czy użyłeś w nim tagu <scope>.
Pasha GR
27

Miałem wiele klas aplikacji w jednym projekcie Spring Boot, w którym uruchomiono sieć i chciałem uniknąć konfigurowania środowiska internetowego dla jednej z nich, więc skonfigurowałem je ręcznie, jak poniżej:

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

UPDATE dla Spring Boot 2 i nowszych:

@SpringBootApplication
public class Application
{
    public static void main(String[] args)
    {
        new SpringApplicationBuilder(Application.class)
            .web(WebApplicationType.NONE)
            .run(args);
    }
}
Robert Hunt
źródło
23

Spróbuj tego

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
    public static void main(String[] args) {
       SpringApplication.run(ScheduledTasks.class, args);
    }
}
Ahmad AlMughrabi
źródło
20

Błąd sugeruje, że aplikacja, którą próbujesz uruchomić, nie może utworzyć wystąpienia apache tomcat. Upewnij się, że uruchamiasz aplikację z tomcat.

jeśli po sprawdzeniu wszystkich zależności napotkasz ten sam problem, spróbuj dodać następujące elementy w swojej klasie konfiguracji

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

Jeśli używasz zewnętrznej instancji tomcat (szczególnie w przypadku intellij), problem może polegać na tym, że IDE próbuje uruchomić osadzony tomcat. W takim przypadku usuń następujące elementy z pom.xml, a następnie skonfiguruj zewnętrznego Tomcata za pomocą kreatora „Edytuj konfiguracje”.

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-tomcat</artifactId>
     <scope>provided</scope>
</dependency> 
Thomas Mwania
źródło
2
Świetna odpowiedź! To rozwiązało mój problem. Jednak to działało w intellij. Kiedy tworzyłem słoik za pomocą wtyczki maven odcień, została utworzona ta sama ścieżka klas, więc tak naprawdę nie rozumiem, co się stało.
praktykant
14

Dodaj

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
Sagar
źródło
8

jeśli wystąpi ten wyjątek podczas korzystania z intellij i próbujesz uruchomić aplikację za pomocą runprzycisku. Zamiast tego spróbuj uruchomić aplikację z wiersza poleceń. Np. Upewnij się, że jesteś we właściwym katalogu (katalogu z plikiem pom), zakładając, że jest to springbootaplikacja uruchomionamvn spring-boot:run to dla mnie.

Dodatkowo widziałem również, że ten błąd występuje, gdy aplikacja sprężynowa zależy od innej aplikacji. W tym przypadku musiałem najpierw uruchomić drugą aplikację, a następnie uruchomić.

Marquis Blount
źródło
1
Ponowne uruchomienie IntelliJ (Ultimate 2016.3 tutaj) naprawiło to dla mnie
Mangusbrother
Oprócz powyższego rozwiązania Marquis, upewniłem się, że wybrałem odpowiednią wersję kombinacji mvn i jdk do uruchomieniamvn spring-boot:run
lnarasimhan
6

Dodawanie adnotacji @SpringBootApplicationZanim klasa startowa naprawiła ten problem dla mnie (więc w istocie ten komunikat o błędzie może oznaczać „nie masz @SpringBootApplicationnigdzie zaznaczonej klasy, potrzebujesz przynajmniej jednej)

@SpringBootApplication
public class AppStarter {

    public static void main(String[] args) {
        SpringApplication.run(AppStarter.class, args);
    }
}
Ahmed Tawila
źródło
4

Miałem podobne problemy, gdy główna metoda znajduje się w innej klasie niż ta przekazana do SpringApplcation.run ()

Więc rozwiązaniem byłoby użycie wykomentowanej linii:

public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
afaulconbridge
źródło
3

Jeśli spakujesz go jako pojedynczy plik jar i nie jest to aplikacja internetowa, spróbuj załadować kontekst aplikacji, jak poniżej.

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

Lub użyj poniższej wtyczki, aby spakować jako pojedynczy słoik

             <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

możesz określić konfiguracje zewnętrzne, używając poniższego polecenia do uruchomienia

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

Zwróć uwagę, że jeśli przekazujesz właściwości jako argumenty, nie dołączaj @PropertySource("classpath:test.properties"), spowoduje to przesłonięcie parametrów

Pavan Kumar Patil
źródło
Dodanie spring-boot-maven-plugin i <phase> package </phase>, a następnie uruchomienie aplikacji jako czystego pakietu mvn zadziałało.
hipokito
2

Jeśli uruchomisz go pomyślnie za pomocą wiersza poleceń gradle bootRun, podczas pakowania go z wiersza poleceń gradle jardo pliku jar, aby uruchomić go z wiersza poleceń java -jar build/libs/demo.jar, niestety nie powiodło się z Wyjątkiem: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory beanw tym przypadku musisz użyć zadania bootRepackagegradle wtyczki, spring-bootaby wygenerować specjalny runnable jar.

  • konfiguracja 1

    $ gradle clean bootRepackage

  • konfiguracja 2

    $ java -jar build / libs / demo.jar

Binhong Wu
źródło
Nie mam pojęcia dlaczego, ale gradle clean bootRepackage mi pomogło. Wcześniej ręcznie czyściłem całą pamięć podręczną i folder kompilacji.
Andrii Abramov
2

SpringApplicationSpróbuje utworzyć odpowiedni rodzaj ApplicationContextw Twoim imieniu. Domyślnie każdy AnnotationConfigApplicationContextlub AnnotationConfigEmbeddedWebApplicationContextbędą stosowane, w zależności od tego, czy tworzenia aplikacji, czy nie.

Algorytm używany do określania „środowiska sieciowego” jest dość uproszczony (oparty na obecności kilku klas). Możesz użyć, setWebEnvironment(boolean webEnvironment)jeśli chcesz zastąpić domyślne.

Możliwe jest również przejęcie pełnej kontroli nad ApplicationContexttypem, który będzie używany przez wywołanie setApplicationContextClass(…​).

[Podpowiedź] Często pożądane jest zadzwonienie setWebEnvironment(false)podczas korzystania SpringApplicationz testu JUnit.

leimbag
źródło
W jaki sposób używasz setWebEnvironment podczas tworzenia aplikacji za pośrednictwem SpringApplication.run(Application.class, args);?
tgdavies
@tgdavies zobacz moją odpowiedź powyżej, możesz użyćSpringApplicationBuilder
Robert Hunt
2

Dodanie zależności od rozruchu sprężynowego naprawiło mój błąd.

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

Jest to wymagane, jeśli chcesz uruchomić tomcat jako serwer osadzony.

Gulzar Hemani
źródło
2

sprawdź, czy plik pom.xml istnieje

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

Miałem taki problem ; Z braku tej zależności

chao.lv
źródło
To rozwiązuje mój problem.
lenhhoxung
1

W moim przypadku dodaliśmy na nowo adnotację @Profile , aby zignorować klasę TestApplication w trybie produkcyjnym i klasę Application w trybie testowym.

Niestety zapomnieliśmy dodać następujący wiersz do plików application.properties:

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

Bez tej konfiguracji żaden profil nie został załadowany, co spowodowało mało mówiący błąd sprężyny.

hb0
źródło
Chciałbym dodać, że możesz również otrzymać ten błąd, jeśli podasz zarówno adnotację @Profile, jak i przekażesz profil do jvm.
slim
1

Powinno to być spowodowane problemem zależności, ogólnie rzecz biorąc, musisz sprawdzić zależność.

Richard
źródło
1

Problem dotyczy tej klasy:

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

Prawidłowy sposób uruchomienia aplikacji to:

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
    }
}
Paolo Mastinu
źródło
1

Wyczyść repozytorium jest jednym z możliwych rozwiązań.

Windows -> usuń wszystkie podfoldery w repozytorium Maven:

C: \ Users \ YourUserName.m2 \ repozytorium

Sergey Chepurnov
źródło
Dla każdego, kto śledzi samouczek PluralSight na temat Java Spring, jest to jedyne rozwiązanie, które zadziałało!
Janac Meena
1

Utknąłem z tym samym problemem. Ponieważ nie zdefiniowałem Main.class i następujących adnotacji w Spring-Boot przy użyciu Mavena:

@SpringBootApplication
public class Main {
    public static void main(String args[]){
        SpringApplication.run(Main.class, args);
    }
}
David Stiffen
źródło
0

Problem polega na wykluczeniu startera tomcat, próbowałem go wykluczyć i użyć vert.x, więc kiedy integruję się z Spring Admin, zacząłem problemy

<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>
Armen Arzumanyan
źródło
0

Miałem ten wyjątek w następującej sytuacji.

w moim POM były właściwości:

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

a nazwa i ścieżka mojej klasy aplikacji („start-class”) były nieprawidłowe.

Igor
źródło
0

Miałem podobny problem, a problemem był uszkodzony plik jar repozytorium maven. W moim przypadku tomcat-embed-coreplik jar został uszkodzony. Dlatego usunąłem go z repozytorium Mavena i odświeżyłem, aby ponownie pobrać.

rokwoon kim
źródło
] Użyj narzędzi formatujących, aby odpowiednio edytować i sformatować swoją odpowiedź.
Morse
0

W moim przypadku dzieje się to po wykluczeniu folderu zasobów z pomponiższego kodu.

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

Komentowanie tego kodu rozpoczęło mój kod.

Korzeń
źródło
0

Inną przyczyną tego problemu jest uszkodzenie plików JAR repozytorium maven, więc możesz użyć następującego polecenia, aby rozwiązać problem:

mvn dependency:purge-local-repository
Abdessattar NOISSI
źródło
0

Prawdopodobnie brakuje Ci @SpringBootApplication w swojej klasie startowej z systemem Spring Boot.

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}
vishal thakur
źródło
0

Używam gradle, spotkałem się z problemem, gdy mam commandLineRunner zużywa tematy kafka i punkt końcowy kontroli kondycji do odbierania przychodzących podpowiedzi. Spędziłem 12 godzin, aby to rozgryźć, w końcu odkryłem, że użyłem rozrusznika mybatis-spring-boot z spring-boot-starter-web i mają pewne konflikty. Później bezpośrednio wprowadziłem mybatis-spring, mybatis i spring-jdbc zamiast mybatis-spring-boot-starter i program działał dobrze.

mam nadzieję że to pomoże

professorrj
źródło