Spring Boot: no se puede iniciar EmbeddedWebApplicationContext debido a que falta el bean EmbeddedServletContainerFactory

173

Soy totalmente nuevo en Spring y comencé a hacer las guías oficiales de este sitio: https://spring.io/guides

Me gustaría hacer esta guía: https://spring.io/guides/gs/scheduling-tasks/

Me sale la siguiente excepción:

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 clase de inicio de la aplicación es esta:

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

Como puede ver, el método principal contiene una línea comentada. Ya he hecho un tutorial, a saber, este: https://spring.io/guides/gs/consuming-rest/ Está en funcionamiento. Pero no puedo ejecutar la aplicación ScheduledTasks, que es la siguiente:

@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 y ejecuto Application.java's main como una aplicación. ¿Alguien podría ayudarme por favor?

Kumite
fuente

Respuestas:

66

La guía de programación no es una aplicación web, por lo que probablemente tenga algunos elementos con moho en su pom.xml de la guía REST. Si sigue las instrucciones de cerca, debería funcionar. Otro problema potencial con el código que publicó anteriormente es que su @EnableAutoConfigurationclase no se usa en el contexto, solo como un método principal (que puede no ser un problema para la guía de programación, pero probablemente lo sea para muchos otros).

Dave Syer
fuente
1
Estoy haciendo todos los tutoriales en un proyecto Eclipse que termina con un pom gigante. Lo puse en un proyecto separado usando el pom del tutorial y ahora funciona perfectamente. ¡Gracias por tu ayuda! ¿Qué sucede si quiero un planificador en una aplicación web Spring usando esta API? No puedo hacer eso
Kumite
De origen puedes hacer eso. Pero entonces necesitarías todas las dependencias para una aplicación web.
Dave Syer
1
Pero luego termino teniendo la excepción que se puede ver en la apertura del hilo. Lo siento, creo que me estoy perdiendo algo. ¿Debo publicar el "mal" pom.xml aquí?
Kumite
1
Un "buen" pom tendría "spring-boot-starter-web" (por conveniencia) o de lo contrario todas las dependencias incluidas en el iniciador se enumeran individualmente. Solo verifica que los tengas. También asegúrese de incluir un @EnableAutoConfigurationen su SpringApplication(el fragmento de código anterior no lo hace).
Dave Syer
66
Funciona perfectamente, no puedo agradecerle lo suficiente. Y para que funcione, tuve que agregar las clases para ejecutar en una matriz de objetos al método de ejecución de SpringApplication:SpringApplication.run(new Object[]{Application.class, ScheduledTasks.class}, args);
Kumite
48

Una exploración del @SpringBootApplicationprograma que incluye las siguientes anotaciones:

@Configuration
@ComponentScan
@EnableAutoConfiguration

Entonces podrías hacer esto también:

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

usa este en tu pom.xml:

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

o este :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
Pasha GR
fuente
1
Agregar 2 jar también funcionó para mí. Aunque tuve que usar ambos
Fafore Tunde
1
@FaforeTunde no es una buena señal, eche un vistazo a su árbol de dependencias y verifique si ha utilizado la etiqueta <scope> en él.
Pasha GR
27

Tenía varias clases de aplicación en un proyecto Spring Boot que tenía la web iniciada incluida y quería evitar que configurara un entorno web para una de ellas, así que la configuré manualmente de la siguiente manera:

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

ACTUALIZACIÓN para Spring Boot 2 y superior:

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

Prueba esto

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

El error sugiere que la aplicación que está intentando ejecutar no puede crear una instancia de apache tomcat. Asegúrese de ejecutar la aplicación con tomcat.

si después de verificar todas sus dependencias experimenta el mismo problema, intente agregar lo siguiente en su clase de configuración

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

Si está utilizando una instancia externa de tomcat (especialmente para intellij), el problema podría ser que el IDE está intentando iniciar el tomcat incrustado. En este caso, elimine lo siguiente de su pom.xml y luego configure el tomcat externo utilizando el asistente 'Editar configuraciones'.

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-tomcat</artifactId>
     <scope>provided</scope>
</dependency> 
Thomas Mwania
fuente
2
¡Gran respuesta! Resolvió mi problema. Sin embargo, estaba trabajando en intellij. Cuando creé el tarro usando el complemento de sombra maven, se creó el mismo classpath, así que realmente no entiendo lo que sucedió.
aprendiz
14

Añadir

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

si experimenta esta excepción mientras usa intellij e intenta iniciar la aplicación con el runbotón. Intente iniciar la aplicación desde la línea de comando. Por ejemplo, asegúrese de estar en el directorio correcto (directorio con su archivo pom) suponiendo que se trata de una springbootaplicación ejecutada, mvn spring-boot:runesto fue el truco para mí.

Además, también he visto que este error ocurre cuando su aplicación de primavera depende de otra aplicación. En este caso, primero tuve que iniciar la otra aplicación y luego ejecutarla.

Marquis Blount
fuente
1
El reinicio de IntelliJ (Ultimate 2016.3 aquí) lo arregló para mí
mangusbrother
Además de la solución dada por Marquis arriba, me aseguré de elegir la versión correcta de la combinación mvn y jdk para ejecutarmvn spring-boot:run
lnarasimhan
6

Agregar la anotación @SpringBootApplicationAntes de que la clase de inicio solucionara este problema (así que, en esencia, este mensaje de error puede significar "no tiene una @SpringBootApplicationclase marcada en ningún lado, necesita al menos una)

@SpringBootApplication
public class AppStarter {

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

He tenido problemas similares cuando el método principal está en una clase diferente a la que se pasó a SpringApplcation.run ()

Entonces, la solución sería usar la línea que ha comentado:

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

Si lo empaqueta como un solo contenedor y no es una aplicación web, intente cargar el contexto de la aplicación como se muestra a continuación.

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

O use el complemento a continuación para empaquetar como un solo frasco

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

puede especificar las configuraciones externas utilizando el siguiente comando para ejecutar

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

Tenga en cuenta que si pasa las propiedades como argumentos, no incluirlos @PropertySource("classpath:test.properties")anulará los parámetros

Pavan Kumar Patil
fuente
Agregar spring-boot-maven-plugin y <phase> package </phase> y luego ejecutar la aplicación como mvn clean package me funcionó.
hipokito
2

Si lo ejecuta con éxito usando la línea de comandos gradle bootRun, mientras lo empaqueta con la línea gradle jarde comandos en el archivo jar para ejecutarlo con la línea de comandos java -jar build/libs/demo.jar, desafortunadamente, falló con la excepción: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory beanen este caso, debe usar la tarea bootRepackagedel complemento gradle spring-bootpara generar jarra ejecutable.

  • configuración 1

    $ gradle clean bootRepackage

  • configuración 2

    $ java -jar build / libs / demo.jar

Binhong Wu
fuente
No tengo idea de por qué, pero gradle clean bootRepackage me ayudó. Anteriormente, he limpiado manualmente todo el caché y la carpeta de compilación.
Andrii Abramov
2

A SpringApplicationintentará crear el tipo correcto ApplicationContexten su nombre. Por defecto, se usará una AnnotationConfigApplicationContexto AnnotationConfigEmbeddedWebApplicationContext, dependiendo de si está desarrollando una aplicación web o no.

El algoritmo utilizado para determinar un 'entorno web' es bastante simplista (basado en la presencia de algunas clases). Puede usarlo setWebEnvironment(boolean webEnvironment)si necesita anular el valor predeterminado.

También es posible tomar el control completo del ApplicationContexttipo que se utilizará llamando setApplicationContextClass(…​).

[Sugerencia] A menudo es conveniente llamar setWebEnvironment(false)cuando se usa SpringApplicationdentro de una prueba JUnit.

leimbag
fuente
¿Cómo se usa setWebEnvironment al crear la aplicación a través de SpringApplication.run(Application.class, args);?
tgdavies
@tgdavies ve mi respuesta arriba, puedes usar elSpringApplicationBuilder
Robert Hunt
2

Agregar la dependencia de arranque de arranque de primavera solucionó mi error.

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

Esto es necesario si desea iniciar el tomcat como un servidor incorporado.

Gulzar Hemani
fuente
2

compruebe que exista su pom.xml

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

He tenido un problema como este ; Por falta de esta dependencia

chao.lv
fuente
Esto soluciona mi problema.
lenhhoxung
1

En mi caso, agregamos la anotación @Profile recientemente para ignorar la clase TestApplication en modo producción y la clase Aplicación en modo prueba.

Desafortunadamente, olvidamos agregar la siguiente línea en los archivos application.properties:

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

Sin esta configuración, no se cargó ningún perfil, lo que causó el error Spring Spring.

hb0
fuente
Me gustaría agregar que también puede obtener este error si proporciona la anotación @Profile y pasa el perfil a la jvm.
delgado
1

Esto debería ser causado por un problema de dependencia, en general, debe verificar la dependencia.

Ricardo
fuente
1

El problema está en esta clase:

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

La forma correcta de iniciar su aplicación es:

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

Borrar repositorio es una posible solución.

Windows -> borra todas las subcarpetas en el repositorio maven:

C: \ Users \ YourUserName.m2 \ repositorio

Sergey Chepurnov
fuente
Para cualquiera que siga el tutorial de PluralSight en Java Spring, ¡esta es la única solución que funcionó para mí!
Janac Meena
1

Me he quedado con el mismo problema. Como no definí Main.class y las siguientes anotaciones en Spring-Boot usando Maven:

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

El problema es la exclusión de starter tomcat, traté de excluirlo y uso vert.x, así que cuando me integro con Spring Admin, comencé problemas

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

Tuve esta excepción en la siguiente situación.

en mi POM fue propiedades:

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

y el nombre y la ruta de mi clase de aplicación ("start-class") estaban equivocados.

Igor
fuente
0

Tuve un problema similar y el problema era un archivo jar maven repo roto. En mi caso, el tomcat-embed-corearchivo jar estaba roto. Así que lo eliminé del repositorio de Maven y lo actualicé para descargar nuevamente.

rokwoon kim
fuente
] Utilice las herramientas de formato para editar y formatear correctamente su respuesta.
Morse
0

En mi caso, sucede después de excluir la carpeta de recursos del pomuso del siguiente código.

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

Comentando este código comenzó mi código.

Raíz
fuente
0

Otra causa de este problema es la corrupción de los tarros de repositorio de Maven para que pueda usar el siguiente comando para resolver el problema:

mvn dependency:purge-local-repository
Abdessattar NOISSI
fuente
0

Probablemente te falte @SpringBootApplication en tu clase de inicio de arranque de primavera.

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}
vishal thakur
fuente
0

Estoy usando gradle, me pareció un problema cuando tengo un commandLineRunner consume temas kafka y un punto final de verificación de salud para recibir ganchos entrantes. Pasé 12 horas para averiguar, finalmente descubrí que usaba mybatis-spring-boot-starter con spring-boot-starter-web, y tienen algunos conflictos. Más tarde, presenté directamente mybatis-spring, mybatis y spring-jdbc en lugar del mybatis-spring-boot-starter, y el programa funcionó bien.

espero que esto ayude

profesorrj
fuente