web-dev-qa-db-fra.com

Spring Boot: impossible de démarrer EmbeddedWebApplicationContext en raison du bean manquant EmbeddedServletContainerFactory

Je suis totalement nouveau au printemps et a commencé à faire les guides officiels de ce site: https://spring.io/guides

Je souhaite faire ce guide: https://spring.io/guides/gs/scheduling-tasks/

J'obtiens l'exception suivante:

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 de démarrage de l'application est la suivante:

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

Comme vous pouvez le constater, la méthode principale contient une ligne commentée. J'ai déjà fait un tutoriel, à savoir celui-ci: https://spring.io/guides/gs/consuming-rest/ Il est opérationnel. Mais je ne peux pas exécuter l'application ScheduledTasks, qui est la suivante:

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

J'utilise Eclipse et exécute le programme principal Application.Java en tant qu'application . Quelqu'un pourrait-il m'aider, s'il vous plaît?

152
Kumite

Le guide de planification n'est pas une application Web, vous avez donc probablement des traces de moisissure dans votre pom.xml du guide REST? Si vous suivez les instructions à la lettre, cela devrait marcher. Un autre problème potentiel avec le code que vous avez posté ci-dessus est que votre classe @EnableAutoConfiguration n'est pas utilisée dans le contexte mais uniquement en tant que méthode principale (ce qui peut ne pas poser de problème pour le guide de planification, mais probablement pour un tas d'autres).

60
Dave Syer

Un scan du @SpringBootApplication montre qu'il comprend les annotations suivantes:

@Configuration
@ComponentScan
@EnableAutoConfiguration

Pour que vous puissiez faire cela aussi:

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

utilisez celui-ci dans votre pom.xml:

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

ou celui-ci:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-Tomcat</artifactId>
</dependency>
28
Pasha Gharibi

Essaye ça

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

L'erreur suggère que l'application que vous essayez d'exécuter ne peut pas instancier une instance d'Apache Tomcat. Assurez-vous que vous exécutez l'application avec Tomcat.

si, après avoir vérifié toutes vos dépendances, vous rencontrez le même problème, essayez d’ajouter ce qui suit dans votre classe de configuration.

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

Si vous utilisez une instance externe de Tomcat (en particulier pour intellij), le problème peut être lié au fait que IDE tente de démarrer Tomcat intégré. Dans ce cas, supprimez les éléments suivants de votre fichier pom.xml, puis configurez le Tomcat externe à l’aide de l’expert "Modifier les configurations".

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-Tomcat</artifactId>
     <scope>provided</scope>
</dependency> 
18
Thomas Mwania

J'avais plusieurs classes d'applications dans un projet Spring Boot qui incluaient le Web et qui voulaient éviter de configurer un environnement Web pour l'une d'entre elles; je l'ai donc configuré manuellement comme suit:

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

UPDATEpour Spring Boot 2 et versions ultérieures:

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

Ajouter 

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

si vous rencontrez cette exception en utilisant intellij et que vous essayez de démarrer l’application avec le bouton run. Essayez de démarrer l'application à partir de la ligne de commande. Par exemple. assurez-vous que vous êtes dans le bon répertoire (répertoire avec votre fichier pom) en supposant qu'il s'agit d'une application springboot exécutée mvn spring-boot:run c'est ce qui a été le cas. 

De plus, j'ai également vu cette erreur se produire lorsque votre application Spring dépend d'une autre application. Dans ce cas, je devais d'abord lancer l'autre application, puis l'exécuter.

7
Marquis Blount

Ajout de l'annotation @SpringBootApplication Avant que la classe de base ne règle ce problème pour moi (ce message d'erreur peut donc signifier "vous n'avez pas de classe marquée @SpringBootApplication, vous devez en avoir au moins un)

@SpringBootApplication
public class AppStarter {

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

J'ai eu des problèmes similaires lorsque la méthode principale utilise une classe différente de celle transmise à SpringApplcation.run () 

La solution serait donc d'utiliser la ligne que vous avez commentée:

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

Si vous le conditionnez comme un seul fichier jar et que ce n'est pas une application Web, essayez de charger le contexte de l'application comme indiqué ci-dessous.

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

Ou utilisez le plugin ci-dessous pour créer un package unique

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

vous pouvez spécifier les configs externes en utilisant la commande ci-dessous pour exécuter

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

Notez que si vous transmettez les propriétés en tant qu'arguments, n'incluez pas @PropertySource("classpath:test.properties"), les paramètres seront alors remplacés.

3
Pavan Kumar Patil

vérifier votre pom.xml est existe 

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

J'ai eu un problème comme celui-ci ; Sans cette dépendance

2
chao.lv

SpringApplication tentera de créer le bon type de ApplicationContext en votre nom. Par défaut, AnnotationConfigApplicationContext ou AnnotationConfigEmbeddedWebApplicationContext sera utilisé, selon que vous développiez une application Web ou non.

L’algorithme utilisé pour déterminer un ‘environnement Web’ est assez simpliste (basé sur la présence de quelques classes). Vous pouvez utiliser setWebEnvironment(boolean webEnvironment) si vous devez remplacer la valeur par défaut.

Il est également possible de prendre le contrôle complet du type ApplicationContext qui sera utilisé en appelant setApplicationContextClass(…​).

[Astuce] Il est souvent souhaitable d'appeler setWebEnvironment(false) lors de l'utilisation de SpringApplication dans un test JUnit.

2
leimbag

Si vous l'exécutez avec succès à l'aide de la ligne de commande gradle bootRun, alors que vous le compressez avec la ligne de commande gradle jar dans le fichier jar afin de l'exécuter avec la ligne de commande Java -jar build/libs/demo.jar, il a malheureusement échoué avec Exception: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. Dans ce cas, vous devez utiliser la tâche bootRepackage de gradle plugin spring-boot pour générer un fichier jar exécutable spécial.

  • configuration 1

    $ gradle clean bootRepackage

  • configuration 2

    $ Java -jar build/libs/demo.jar 

2
Binhong Wu

L'ajout de la dépendance du démarreur de démarrage à ressort a corrigé mon erreur.

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

Cela est nécessaire si vous souhaitez démarrer Tomcat en tant que serveur intégré.

2
Gulzar Hemani

Dans mon cas, nous avons récemment ajouté l'annotation @Profile} afin d'ignorer la classe TestApplication en mode production et la classe Application en mode test.

Malheureusement, nous avons oublié d'ajouter la ligne suivante dans les fichiers application.properties:

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

Sans cette configuration, aucun profil n’a été chargé, ce qui a provoqué l’énoncé Spring Error.

1
hb0

Cela devrait être dû à un problème de dépendance. En général, vous devez vérifier la dépendance.

1
richard

Clear repository est une solution possible.

Windows -> supprimer tous les sous-dossiers du référentiel maven:

C:\Users\YourUserName.m2\repository

1
Sergey Chepurnov

Le problème c'est dans cette classe:

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

La manière correcte de lancer votre application est la suivante:

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

Dans mon cas, cela se produit après avoir exclu le dossier de ressources de la pom à l'aide du code suivant.

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

Commenter ce code a commencé mon code.

0
Root

Le problème est l’exclusion du démarreur Tomcat, j’ai essayé de l’exclure et d’utiliser vert.x; ainsi, lorsque j’intègre wit Spring Admin, des problèmes ont commencé

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

Vous avez probablement perdu @SpringBootApplication dans votre classe de démarrage de démarrage de printemps.

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}
0
vishal thakur

J'ai eu cette exception dans la situation suivante.

dans mon POM était propriétés:

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

et le nom et le chemin de ma classe d'application ("start-class") étaient faux. 

0
Igor

J'ai eu un problème similaire et le problème était un fichier jar repo maven cassé. Dans mon cas, le fichier jar Tomcat-embed-core était cassé. Je l'ai donc retiré du dépôt Maven et l'ai actualisé pour le télécharger à nouveau.

0
rokwoon kim

Une autre cause de ce problème est la corruption des fichiers jar du référentiel maven. Vous pouvez donc utiliser la commande suivante pour résoudre le problème: 

mvn dependency:purge-local-repository
0
Abdessattar NOISSI

J'ai collé avec le même problème. Comme je n'ai pas défini Main.class et les annotations suivantes dans Spring-Boot avec Maven:

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