Spring Boot: impossibile avviare EmbeddedWebApplicationContext a causa del bean EmbeddedServletContainerFactory mancante


173

Sono totalmente nuovo a Spring e ho iniziato a fare le guide ufficiali da questo sito: https://spring.io/guides

Vorrei fare questa guida: https://spring.io/guides/gs/scheduling-tasks/

Ottengo la seguente eccezione:

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

La classe di avvio dell'applicazione è questa:

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

Come puoi vedere, il metodo principale contiene una riga commentata. Ho già fatto un tutorial, in particolare questo: https://spring.io/guides/gs/consuming-rest/ È attivo e funzionante. Ma non riesco a eseguire l'app ScheduledTasks, che è la seguente:

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

Uso Eclipse ed eseguo l'applicazione principale di Application.java come Applicazione. Qualcuno può aiutarmi?

Risposte:


66

La guida alla pianificazione non è un'app Web, quindi probabilmente hai alcune cose ammuffite nel tuo pom.xml dalla guida REST? Se segui attentamente le istruzioni, dovrebbe funzionare. Un altro potenziale problema con il codice che hai pubblicato sopra è che la tua @EnableAutoConfigurationclasse non viene utilizzata nel contesto, ma solo come metodo principale (che potrebbe non essere un problema per la guida alla pianificazione, ma probabilmente lo è per molti altri).


1
Sto facendo tutti i tutorial in un progetto Eclipse finendo con un pom gigante. L'ho messo in un progetto separato usando il pom del tutorial e ora funziona perfettamente. Grazie per l'aiuto! Cosa succede se desidero uno scheduler in una webapp Spring che utilizza questa API? Non posso farlo?
Kumite,

Di origine puoi farlo. Ma allora avresti bisogno di tutte le dipendenze per una webapp.
Dave Syer,

1
Ma poi finisco per avere l'eccezione che puoi vedere nell'apertura del thread. Scusa, penso che mi manchi qualcosa. Devo pubblicare il pom.xml "cattivo" qui?
Kumite,

1
Un "buon" pom avrebbe "spring-boot-starter-web" (per comodità) oppure tutte le dipendenze incluse nello starter sono elencate singolarmente. Controlla solo di averli. Assicurati anche di includere un @EnableAutoConfigurationnel tuo SpringApplication(lo snippet di codice sopra non lo fa).
Dave Syer,

6
Funziona perfettamente, non posso ringraziarti abbastanza. E per farlo funzionare ho dovuto aggiungere le classi da eseguire in un array di oggetti al metodo di esecuzione di SpringApplication:SpringApplication.run(new Object[]{Application.class, ScheduledTasks.class}, args);
Kumite,

48

Una scansione dello @SpringBootApplicationspettacolo che include le seguenti annotazioni:

@Configuration
@ComponentScan
@EnableAutoConfiguration

Quindi potresti farlo anche tu:

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

29

usa questo nel tuo pom.xml:

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

o questo:

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

1
L'aggiunta di 2 vasetti ha funzionato anche per me. Ho dovuto usare entrambi però
Fafore Tunde il

1
@FaforeTunde non è un buon segno, dai un'occhiata al tuo albero delle dipendenze e controlla se hai usato il tag <scope> in esso.
Pasha GR,

27

Avevo più classi di applicazioni in un progetto Spring Boot che includeva il Web avviato e volevo evitare che configurasse un ambiente Web per uno di loro, quindi l'ho configurato manualmente come di seguito:

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

AGGIORNAMENTO per Spring Boot 2 e versioni successive:

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

23

Prova questo

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

20

L'errore suggerisce che l'applicazione che si sta tentando di eseguire non può creare un'istanza di apache tomcat. Assicurati di eseguire l'applicazione con Tomcat.

se dopo aver verificato tutte le dipendenze si verifica lo stesso problema, provare ad aggiungere quanto segue nella classe di configurazione

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

Se si utilizza un'istanza esterna di tomcat (specialmente per intellij), il problema potrebbe essere che l'IDE sta tentando di avviare il tomcat incorporato. In questo caso, rimuovere quanto segue da pom.xml, quindi configurare il tomcat esterno utilizzando la procedura guidata "Modifica configurazioni".

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

2
Bella risposta! Ha risolto il mio problema. Comunque funzionava in intellij. Quando ho creato il vaso usando il plugin Maven Shadow, è stato creato lo stesso percorso di classe, quindi non capisco davvero cosa è successo.
apprendista

14

Inserisci

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

8

se si verifica questa eccezione durante l'utilizzo di intellij e si sta tentando di avviare l'applicazione con il runpulsante. Prova invece ad avviare l'applicazione dalla riga di comando. Ad esempio assicurati di essere nella directory corretta (directory con il tuo file pom) supponendo che si tratti di springbootun'applicazione eseguitamvn spring-boot:run per me.

Inoltre ho visto questo errore verificarsi quando l'applicazione di primavera dipende da un'altra applicazione. In questo caso ho dovuto avviare prima l'altra applicazione, quindi eseguire.


1
Riavviare IntelliJ (qui Ultimate 2016.3 qui) risolto il problema per me
mangusbrother

Oltre alla soluzione fornita dal Marchese sopra, mi sono assicurato di aver scelto la versione giusta della combinazione mvn e jdk per eseguire ilmvn spring-boot:run
lnarasimhan il

6

Aggiungere l'annotazione @SpringBootApplicationPrima che la classe di partenza risolvesse questo problema per me (quindi, in sostanza, questo messaggio di errore può significare "non hai una @SpringBootApplicationclasse contrassegnata da nessuna parte, ne hai bisogno almeno una)

@SpringBootApplication
public class AppStarter {

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

4

Ho avuto problemi simili quando il metodo principale è su una classe diversa da quella passata a SpringApplcation.run ()

Quindi la soluzione sarebbe quella di utilizzare la riga che hai commentato:

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

3

Se lo impacchetti come un singolo vaso ed è un'app non web, prova a caricare il contesto dell'app come di seguito.

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

Oppure usa il plugin seguente per creare un pacchetto come un singolo vaso

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

puoi specificare le configurazioni esterne usando il comando qui sotto per eseguire

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

Si noti che se si passano le proprietà come argomenti, quindi non includerle @PropertySource("classpath:test.properties"), i parametri verranno sovrascritti


Aggiungendo il plug-in spring-boot-maven e il <phase> pacchetto </phase> e quindi eseguendo l'app mentre il pacchetto mvn clean ha funzionato per me.
hipokito,

2

Se lo esegui correttamente utilizzando la riga di comando gradle bootRun , mentre lo impacchi con la riga di comando gradle jarnel file jar per eseguirlo con la riga di comando java -jar build/libs/demo.jar, sfortunatamente, non è riuscito con Eccezione :, Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory beanin questo caso, devi utilizzare l'attività bootRepackagedel plug-in gradle spring-bootper generare speciali barattolo eseguibile.

  • installazione 1

    $ gradle clean bootRepackage

  • installazione 2

    $ java -jar build / libs / demo.jar


Non ho idea del perché, ma gradle clean bootRepackage mi ha aiutato. In precedenza, ho pulito manualmente tutta la cache e la cartella di creazione.
Andrii Abramov,

2

A SpringApplicationtenterà di creare il giusto tipo di ApplicationContextper tuo conto. Per impostazione predefinita, verrà utilizzato un AnnotationConfigApplicationContexto AnnotationConfigEmbeddedWebApplicationContext, a seconda che si stia sviluppando o meno un'applicazione Web.

L'algoritmo utilizzato per determinare un "ambiente Web" è abbastanza semplicistico (basato sulla presenza di alcune classi). È possibile utilizzare setWebEnvironment(boolean webEnvironment)se è necessario sostituire l'impostazione predefinita.

È anche possibile assumere il controllo completo del ApplicationContexttipo che verrà utilizzato chiamandosetApplicationContextClass(…​) .

[Suggerimento] È spesso preferibile chiamare setWebEnvironment(false)quando si utilizza SpringApplicationall'interno di un test JUnit.


Come si usa setWebEnvironment durante la creazione dell'applicazione tramite SpringApplication.run(Application.class, args);?
tgdavies,

@tgdavies vedi la mia risposta sopra, puoi usare ilSpringApplicationBuilder
Robert Hunt il

2

L'aggiunta della dipendenza di avvio con avvio a molla ha corretto il mio errore.

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

Ciò è necessario se si desidera avviare Tomcat come server incorporato.


2

controlla che il tuo pom.xml sia presente

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

Ho avuto un problema come questo ; Per mancanza di questa dipendenza


Questo risolve il mio problema.
lenhhoxung,

1

Nel mio caso abbiamo aggiunto di nuovo l'annotazione @Profile per ignorare la classe TestApplication in modalità produzione e la classe Application in modalità test.

Sfortunatamente, abbiamo dimenticato di aggiungere la seguente riga nei file application.properties:

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

Senza questa configurazione non è stato caricato alcun profilo che ha causato l'errore di primavera non tanto detto.


Vorrei aggiungere che è anche possibile ottenere questo errore se si fornisce sia l'annotazione @Profile che si passa il profilo a jvm.
magro

1

Ciò dovrebbe essere causato da un problema di dipendenza, in generale, è necessario controllare la dipendenza.


1

Il problema è in questa classe:

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

Il modo corretto di avviare l'applicazione è:

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

1

Cancella repository è una possibile soluzione.

Windows -> elimina tutte le sottocartelle nel repository maven:

C: \ Users \ YourUserName.m2 \ repository


Per chiunque segua il tutorial di PluralSight su Java Spring, questa è l'unica soluzione che ha funzionato per me!
Janac Meena,

1

Mi sono bloccato con lo stesso problema. Dato che non ho definito Main.class e le seguenti annotazioni in Spring-Boot usando Maven:

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

0

Il problema è l'esclusione di Tomcat di avviamento, ho provato a escluderlo e utilizzare vert.x, quindi quando ho integrato wit Spring Admin, ho iniziato a riscontrare problemi

<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

Ho avuto questa eccezione nella seguente situazione.

nel mio POM c'erano proprietà:

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

e il nome e il percorso della mia classe di applicazione ("start-class") erano errati.


0

Ho avuto un problema simile e il problema era un file jar del repository maven rotto. Nel mio caso, il tomcat-embed-corefile jar era rotto. Quindi l'ho rimosso dal repository di Maven e l'ho aggiornato per scaricarlo di nuovo.


] Utilizzare gli strumenti di formattazione per modificare e formattare correttamente la risposta.
Morse,

0

Nel mio caso succede dopo aver escluso la cartella delle risorse pomdall'uso del seguente codice.

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

Commentando questo codice è iniziato il mio codice.


0

Un'altra causa di questo problema è la corruzione dei vasetti del repository maven in modo da poter usare il comando seguente per risolvere il problema:

mvn dependency:purge-local-repository

0

Probabilmente ti manca @SpringBootApplication nella classe di avvio di avvio di primavera.

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}

0

Sto usando il gradle, ho incontrato un problema quando ho un comandoLineRunner consuma argomenti kafka e un endpoint di controllo dello stato per ricevere hook in arrivo. Ho impiegato 12 ore per capire, finalmente ho scoperto che ho usato mybatis-spring-boot-starter con web-boot-starter-web, e hanno dei conflitti. Ultimamente ho introdotto direttamente mybatis-spring, mybatis e spring-jdbc piuttosto che mybatis-spring-boot-starter, e il programma ha funzionato bene.

spero che questo ti aiuti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.