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


173

Je suis totalement nouveau sur Spring et j'ai commencé à faire les guides officiels de ce site: https://spring.io/guides

J'aimerais 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 voir, 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 j'exécute le fichier principal d'Application.java en tant qu'application. Quelqu'un pourrait-il m'aider s'il vous plaît?

Réponses:


66

Le guide de planification n'est pas une application Web, vous avez donc probablement des éléments moisis dans votre pom.xml à partir du guide REST? Si vous suivez attentivement les instructions, cela devrait fonctionner. Un autre problème potentiel avec le code que vous avez publié ci-dessus est que votre @EnableAutoConfigurationclasse n'est pas utilisée dans le contexte, uniquement comme méthode principale (ce qui peut ne pas être un problème pour le guide de planification, mais c'est probablement pour un tas d'autres).


1
Je fais tous les tutoriels dans un seul projet Eclipse se terminant par un pom géant. Je l'ai mis dans un projet séparé en utilisant le pom du tutoriel et maintenant cela fonctionne parfaitement. Merci de votre aide! Que faire si je veux un planificateur dans une application Web Spring utilisant cette API? Je ne peux pas faire ça?
Kumite

De source, vous pouvez le faire. Mais alors vous auriez besoin de toutes les dépendances pour une webapp.
Dave Syer

1
Mais ensuite, je finis par avoir l'exception que vous pouvez voir dans l'ouverture du fil. Désolé, je pense qu'il me manque quelque chose. Dois-je publier le "mauvais" pom.xml ici?
Kumite

1
Un "bon" pom aurait "spring-boot-starter-web" (pour plus de commodité) ou bien toutes les dépendances incluses dans le démarreur répertoriées individuellement. Vérifiez simplement que vous les avez. Assurez-vous également d'inclure un @EnableAutoConfigurationdans votre SpringApplication(l'extrait de code ci-dessus ne le fait pas).
Dave Syer

6
Fonctionne parfaitement, je ne peux pas vous remercier assez. Et pour que cela fonctionne, j'ai dû ajouter les classes à exécuter dans un tableau Object à la méthode d'exécution de SpringApplication:SpringApplication.run(new Object[]{Application.class, ScheduledTasks.class}, args);
Kumite le

48

Un scan de l' @SpringBootApplicationémission qui comprend les annotations suivantes:

@Configuration
@ComponentScan
@EnableAutoConfiguration

Vous pouvez donc faire ceci aussi:

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

29

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>

1
L'ajout de 2 pots a également fonctionné pour moi. J'ai dû utiliser les deux cependant
Fafore Tunde

1
@FaforeTunde ce n'est pas bon signe, jetez un œil à votre arbre de dépendances et vérifiez si vous y avez utilisé la balise <scope>.
Pasha GR

27

J'avais plusieurs classes d'application dans un projet Spring Boot qui incluait le Web et je voulais éviter de configurer un environnement Web pour l'un d'entre eux, je l'ai donc configuré manuellement comme ci-dessous:

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

MISE À JOUR pour Spring Boot 2 et supérieur:

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

23

Essaye ça

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

20

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 que l'EDI tente de démarrer le tomcat intégré. Dans ce cas, supprimez les éléments suivants de votre pom.xml puis configurez le tomcat externe à l'aide de l'assistant «Modifier les configurations».

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

2
Très bonne réponse! Cela a résolu mon problème. Cependant, cela fonctionnait dans intellij. Quand j'ai créé le jar en utilisant le plugin maven shad, le même classpath a été créé, donc je ne comprends pas vraiment ce qui s'est passé.
apprenti

14

Ajouter

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

8

si vous rencontrez cette exception lors de l'utilisation d'intellij et que vous essayez de démarrer l'application avec le runbouton. Essayez plutôt 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 springbootapplication exécutée, mvn spring-boot:runcela a fait l'affaire pour moi.

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


1
Le redémarrage d'IntelliJ (Ultimate 2016.3 ici) l'a corrigé pour moi
mangusbrother

En plus de la solution donnée par Marquis ci-dessus, je me suis assuré de choisir la bonne version de la combinaison mvn et jdk pour exécuter lemvn spring-boot:run
lnarasimhan le

6

Ajout de l'annotation @SpringBootApplicationAvant que la classe de démarrage ne corrige ce problème pour moi (donc en substance, ce message d'erreur peut signifier "vous n'avez pas de @SpringBootApplicationclasse marquée nulle part, vous en avez besoin au moins une)

@SpringBootApplication
public class AppStarter {

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

4

J'ai eu des problèmes similaires lorsque la méthode principale est sur une classe différente de celle passée à 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);
    }
}

3

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

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

Ou utilisez le plugin ci-dessous pour empaqueter en un seul pot

             <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 configurations 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 passez les propriétés en tant qu'arguments, ne les incluez pas, @PropertySource("classpath:test.properties")cela remplacera les paramètres


L'ajout du plugin spring-boot-maven-plugin et du <phase> package </phase>, puis l'exécution de l'application en tant que package mvn clean a fonctionné pour moi.
hipokito

2

Si vous l'exécutez avec succès en utilisant la ligne de commande gradle bootRun, tout en l'empaquetant avec la ligne de commande gradle jardans le fichier jar afin de l'exécuter avec la ligne de commande java -jar build/libs/demo.jar, malheureusement, il a échoué avec Exception :, Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory beandans ce cas, vous devez utiliser la tâche bootRepackagedu plugin gradle spring-bootpour générer des pot exécutable.

  • configuration 1

    $ gradle clean bootRepackage

  • configuration 2

    $ java -jar build / libs / demo.jar


Je ne sais pas pourquoi, mais gradle clean bootRepackage m'a aidé. Auparavant, je nettoyais manuellement tout le cache et le dossier de construction.
Andrii Abramov

2

A SpringApplicationtentera de créer le bon type de ApplicationContexten votre nom. Par défaut, un AnnotationConfigApplicationContextou AnnotationConfigEmbeddedWebApplicationContextsera utilisé, selon que vous développez ou non une application Web.

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 ApplicationContexttype qui sera utilisé en appelant setApplicationContextClass(…​).

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


Comment utilisez-vous setWebEnvironment lors de la création de l'application via SpringApplication.run(Application.class, args);?
tgdavies

@tgdavies voir ma réponse ci-dessus, vous pouvez utiliser leSpringApplicationBuilder
Robert Hunt

2

L'ajout de la dépendance de démarrage de printemps a corrigé mon erreur.

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

Ceci est nécessaire si vous souhaitez démarrer le tomcat en tant que serveur intégré.


2

vérifiez que votre pom.xml existe

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

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


Cela résout mon problème.
lenhhoxung

1

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 ces config, aucun profil n'a été chargé, ce qui a causé l'erreur de printemps pas tellement.


Je voudrais ajouter que vous pouvez également obtenir cette erreur si vous fournissez à la fois l'annotation @Profile et transmettez le profil au jvm.
slim

1

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


1

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 bonne façon de lancer votre application est:

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

1

Un référentiel clair est une solution possible.

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

C: \ Users \ YourUserName.m2 \ repository


À tous ceux qui suivent le tutoriel PluralSight sur Java Spring, c'est la seule solution qui a fonctionné pour moi!
Janac Meena

1

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

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

0

Le problème est l'exclusion du démarreur tomcat, j'ai essayé de l'exclure et d'utiliser vert.x, donc lorsque j'intègre avec 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

J'ai eu cette exception dans la situation suivante.

dans mon POM se trouvaient des 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

J'ai eu un problème similaire et le problème était un fichier jar maven repo cassé. Dans mon cas, le tomcat-embed-corefichier jar était cassé. Je l'ai donc supprimé du repo maven et l'ai actualisé pour le télécharger à nouveau.


] Veuillez utiliser les outils de mise en forme pour éditer et formater correctement votre réponse.
Morse

0

Dans mon cas, cela se produit après avoir exclu le dossier de ressources de l' pomutilisation 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

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

mvn dependency:purge-local-repository

0

Vous n'avez probablement pas @SpringBootApplication dans votre classe de démarrage Spring Boot.

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}

0

J'utilise gradle, rencontré un problème lorsque j'ai une commandeLineRunner consomme des sujets kafka et un point de terminaison de vérification de l'état pour recevoir des hooks entrants. J'ai passé 12 heures à comprendre, j'ai finalement découvert que j'avais utilisé mybatis-spring-boot-starter avec spring-boot-starter-web, et ils avaient des conflits. Dernièrement, j'ai directement introduit mybatis-spring, mybatis et spring-jdbc plutôt que mybatis-spring-boot-starter, et le programme a bien fonctionné.

J'espère que cela t'aides

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.