java - tutorial - Spring Boot: no se puede iniciar EmbeddedWebApplicationContext debido a que falta Bean EmbeddedServletContainerFactory
spring boot tutorial (24)
Añadir
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Soy totalmente nuevo en Spring y comencé a hacer las guías oficiales desde este sitio: https://spring.io/guides
Me gustaría hacer esta guía: https://spring.io/guides/gs/scheduling-tasks/
Obtengo 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(Application.class, args);
SpringApplication.run(ScheduledTasks.class, args);
}
}
Como puede ver, el método principal contiene una línea comentada. Ya hice 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 el principal de Application.java como una aplicación. ¿Alguien podría ayudarme por favor?
Agregar la anotación @SpringBootApplication
Antes de que la clase de inicio solucionara este problema para mí (por lo que en esencia, este mensaje de error puede significar que "no tiene una clase marcada @SpringBootApplication
ningún lado, necesita al menos uno)
@SpringBootApplication
public class AppStarter {
public static void main(String[] args) {
SpringApplication.run(AppStarter.class, args);
}
}
Agregar la dependencia del arrancador de arranque de resorte solucionó mi error.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Esto es obligatorio si desea iniciar el tomcat como un servidor embebido.
El error sugiere que la aplicación que está intentando ejecutar no puede instanciar 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 intelij), el problema podría ser que el IDE está tratando de 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>
El problema es la exclusión de Tomcat inicial, probé a excluirlo y uso vert.x, así que cuando intenté con Spring Admin, comencé a tener 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>
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);
}
}
En mi caso ocurre después de excluir la carpeta de recursos del pom
usando el 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.
En mi caso, agregamos la anotación @Profile recientemente para ignorar la clase TestApplication en modo de producción y la clase Application en modo de prueba.
Lamentablemente, olvidamos agregar la siguiente línea en los archivos application.properties:
spring.profiles.active=test
or
spring.profiles.active=production
Sin estas configuraciones, no se cargó ningún perfil, lo que provocó el no tan gran dicho Spring Error.
Esto debe ser causado por un problema de dependencia; en general, debe verificar la dependencia.
He tenido problemas similares cuando el método principal está en una clase diferente de la que 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);
}
}
La guía de programación no es una aplicación web, ¿entonces es probable que tenga algunas cosas con moho en su pom.xml de la guía REST? Si sigues las instrucciones de cerca, debería funcionar. Otro posible problema con el código que publicó anteriormente es que su clase @EnableAutoConfiguration
no se utiliza 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 es para muchos otros).
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);
}
}
Prueba esto
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(ScheduledTasks.class, args);
}
}
Si lo ejecuta satisfactoriamente con la línea de comando gradle bootRun
, al empaquetarlo con el gradle jar
línea de gradle jar
al archivo jar para ejecutarlo con la línea de comando java -jar build/libs/demo.jar
, desafortunadamente falló con Exception: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean
, en este caso, debe usar la tarea bootRepackage
del complemento gradle spring-boot
para generar un jar especial ejecutable.
- configuración 1
$ gradle clean bootRepackage
- configuración 2
$ java -jar build / libs / demo.jar
Si lo empaqueta como un único contenedor y no es una aplicación web, intente cargar el contexto de la aplicación como se indica a continuación.
@SpringBootApplication
ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);
O use el siguiente plugin para empacar como un solo contenedor
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
usted puede especificar las configuraciones externas usando el siguiente comando para ejecutar
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
Tenga en cuenta que si está pasando las propiedades como argumentos, entonces no incluye @PropertySource("classpath:test.properties")
y anulará los parámetros.
Tenía varias clases de aplicaciones en un proyecto Spring Boot que tenía la web comenzada incluida y quería evitar que configurara un entorno web para una de ellas, así que lo configuré manualmente de la siguiente manera:
@SpringBootApplication
public class Application
{
public static void main(String[] args)
{
new SpringApplicationBuilder(Application.class).web(false).run(args);
}
}
Tuve esta excepción en la siguiente situación.
en mi POM eran 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 ("clase de inicio") era incorrecta.
Tuve un problema similar y el problema fue un archivo maven repo jar roto. En mi caso, el archivo jar tomcat-embed-core
estaba roto. Así que lo eliminé del repositorio maven y lo actualicé para descargarlo nuevamente.
Un escaneo de @SpringBootApplication muestra 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);
}
}
Una SpringApplication
intentará crear el tipo correcto de ApplicationContext
en su nombre. De forma predeterminada, se usará AnnotationConfigApplicationContext
o 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 unas pocas clases). Puede usar setWebEnvironment(boolean webEnvironment)
si necesita anular el valor predeterminado.
También es posible tomar el control completo del tipo de ApplicationContext
que se usará al llamar a setApplicationContextClass(…)
.
[Sugerencia] A menudo es conveniente llamar a setWebEnvironment(false)
cuando se usa SpringApplication
dentro de una prueba JUnit.
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>
compruebe que su pom.xml existe
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
He tenido un problema como este; por falta esta dependencia
si experimenta esta excepción al usar intellij e intenta iniciar la aplicación con el botón run
. Intente iniciar la aplicación desde la línea de comando en su lugar. Por ejemplo, asegúrese de que está en el directorio correcto (directorio con su archivo pom) suponiendo que se trata de una aplicación mvn spring-boot:run
ejecute mvn spring-boot:run
esto hizo el truco para mí.
Además, también he visto este error cuando su aplicación de primavera depende de otra aplicación. En este caso, tuve que iniciar la otra aplicación primero y luego ejecutar.
El repositorio claro es una posible solución.
Windows -> eliminar todas las subcarpetas en el repositorio de maven:
C: / Users / YourUserName.m2 / repository