it-swarm.com.de

Spring Boot: EmbeddedWebApplicationContext kann nicht gestartet werden, da die EmbeddedServletContainerFactory-Bean fehlt

Ich bin völlig neu in Spring und habe angefangen, die offiziellen Guides von dieser Site zu erstellen: https://spring.io/guides

Ich möchte diesen Leitfaden ausführen: https://spring.io/guides/gs/scheduling-tasks/

Ich bekomme die folgende Ausnahme:

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

Die Anwendungsstarterklasse lautet wie folgt:

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

Wie Sie sehen, enthält die Hauptmethode eine kommentierte Zeile. Ich habe bereits ein Tutorial gemacht, und zwar dieses: https://spring.io/guides/gs/consuming-rest/ Es läuft. Ich kann die ScheduledTasks-App jedoch nicht ausführen. Dies ist die folgende:

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

Ich benutze Eclipse und führe die Anwendung von Application.Java als Anwendung aus. Könnte mir bitte jemand helfen?

152
Kumite

Der Planungsleitfaden ist keine Web-App. Sie haben also wahrscheinlich etwas schäbiges Zeug in Ihrer pom.xml aus dem REST - Handbuch? Wenn Sie die Anweisungen genau befolgen, sollte es funktionieren. Ein weiteres potenzielles Problem mit dem Code, den Sie oben veröffentlicht haben, ist, dass Ihre @EnableAutoConfiguration-Klasse nicht im Kontext verwendet wird, sondern nur als Hauptmethode.

60
Dave Syer

Ein Scan des @SpringBootApplication zeigt, dass er folgende Anmerkungen enthält:

@Configuration
@ComponentScan
@EnableAutoConfiguration

So kannst du das auch tun:

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

verwenden Sie diese in Ihrer pom.xml:

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

oder dieses :

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

Versuche dies

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

Der Fehler weist darauf hin, dass die Anwendung, die Sie ausführen möchten, keine Instanz von Apache Tomcat instanziieren kann. Stellen Sie sicher, dass Sie die Anwendung mit Tomcat ausführen.

wenn Sie nach dem Überprüfen aller Abhängigkeiten dasselbe Problem feststellen, versuchen Sie Folgendes in Ihre Konfigurationsklasse einzufügen

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

Wenn Sie eine externe Instanz von Tomcat (insbesondere für Intellij) verwenden, könnte das Problem sein, dass die IDE versucht, den eingebetteten Tomcat zu starten. Entfernen Sie in diesem Fall Folgendes aus Ihrer pom.xml und konfigurieren Sie dann den externen Tomcat mit dem Assistenten zum Bearbeiten von Konfigurationen.

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

Ich hatte mehrere Anwendungsklassen in einem Spring Boot-Projekt, bei denen das Web bereits gestartet war, und wollte vermeiden, dass eine Webumgebung für eines von ihnen konfiguriert wird.

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

UPDATEfür Spring Boot 2 und höher:

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

Hinzufügen 

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

wenn diese Ausnahme bei der Verwendung von intellij auftritt und Sie versuchen, die Anwendung mit der Schaltfläche run zu starten. Starten Sie die Anwendung stattdessen von der Befehlszeile aus. Z.B. Stellen Sie sicher, dass Sie sich im richtigen Verzeichnis (Verzeichnis mit der POM-Datei) befinden, vorausgesetzt, es handelt sich um eine springboot-Anwendung, die mvn spring-boot:run ausgeführt wird. 

Außerdem habe ich gesehen, dass dieser Fehler auftritt, wenn Ihre Federanwendung von einer anderen Anwendung abhängt. In diesem Fall musste ich zuerst die andere Anwendung starten und dann ausführen.

7
Marquis Blount

Hinzufügen der Anmerkung @SpringBootApplication Bevor die Starter-Klasse dieses Problem behoben hat, kann diese Fehlermeldung bedeuten: "Sie haben keine @SpringBootApplication-markierte Klasse, Sie benötigen mindestens eine."

@SpringBootApplication
public class AppStarter {

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

Ich hatte ähnliche Probleme, wenn sich die Hauptmethode in einer anderen Klasse befindet als der an SpringApplcation.run () übergebenen. 

Die Lösung wäre also die Zeile zu verwenden, die Sie auskommentiert haben:

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

Wenn Sie es als einzelnes Jar verpacken und es sich nicht um eine Web-App handelt, laden Sie den App-Kontext wie folgt.

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

Oder verwenden Sie das folgende Plugin, um es als einzelne Dose zu verpacken

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

sie können die externen Konfigurationen angeben, indem Sie den folgenden Befehl ausführen

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

Wenn Sie die Eigenschaften als Argumente übergeben, müssen Sie @PropertySource("classpath:test.properties") nicht einschließen, da dadurch die Parameter überschrieben werden

3

Überprüfen Sie, ob Ihre Pom.xml vorhanden ist 

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

Ich hatte ein Problem wie dieses ; Für diese Abhängigkeit fehlt

2
chao.lv

Eine SpringApplication versucht, den richtigen Typ von ApplicationContext in Ihrem Namen zu erstellen. Standardmäßig wird eine AnnotationConfigApplicationContext oder AnnotationConfigEmbeddedWebApplicationContext verwendet, abhängig davon, ob Sie eine Webanwendung entwickeln oder nicht.

Der zur Bestimmung einer "Webumgebung" verwendete Algorithmus ist ziemlich simpel (basierend auf dem Vorhandensein einiger Klassen). Sie können setWebEnvironment(boolean webEnvironment) verwenden, wenn Sie den Standardwert überschreiben möchten.

Es ist auch möglich, die vollständige Kontrolle über den ApplicationContext-Typ zu übernehmen, der durch den Aufruf von setApplicationContextClass(…​) verwendet wird.

[Tipp] Es ist oft wünschenswert, setWebEnvironment(false) aufzurufen, wenn Sie SpringApplication innerhalb eines JUnit-Tests verwenden.

2
leimbag

Wenn Sie es erfolgreich mit der Befehlszeile gradle bootRun ausführen, während Sie es mit der Befehlszeile gradle jar in eine JAR-Datei packen, um es mit der Befehlszeile Java -jar build/libs/demo.jar auszuführen, schlug es leider mit der Ausnahme: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean fehl. In diesem Fall müssen Sie die Task bootRepackage von verwenden gradle plugin spring-boot zur erzeugung spezieller lauffähiger jar.

  • setup 1

    $ gradle clean bootRepackage

  • setup 2

    $ Java -jar build/libs/demo.jar 

2
Binhong Wu

Das Hinzufügen der Abhängigkeit zwischen dem Start des Starters für den Springstart wurde behoben.

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

Dies ist erforderlich, wenn Sie den Tomcat als eingebetteten Server starten möchten.

2
Gulzar Hemani

In meinem Fall haben wir die Annotation @Profile neu hinzugefügt , um die TestApplication-Klasse im Produktionsmodus und die Application-Klasse im Testmodus zu ignorieren.

Leider haben wir vergessen, die folgende Zeile in die Dateien application.properties einzufügen:

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

Ohne diese Konfig wurde kein Profil geladen, was zu dem nicht so viel gesprochenen Spring Error führte.

1
hb0

Dies sollte durch Abhängigkeitsproblem verursacht werden. Im Allgemeinen müssen Sie die Abhängigkeit überprüfen.

1
richard

Clear Repository ist eine mögliche Lösung.

Windows -> Alle Unterordner im Maven-Repository löschen:

C:\Benutzer\IhrBenutzername.m2\Repository

1

Das Problem ist in dieser Klasse:

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

Der korrekte Weg, um Ihre Anwendung zu starten, ist:

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

In meinem Fall geschieht dies, nachdem der Ressourcenordner mit dem folgenden Code aus der Variablen pom ausgeschlossen wurde.

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

Durch das Kommentieren dieses Codes wurde mein Code gestartet.

0
Root

Problem ist der Ausschluss von Starter Tomcat. Ich habe versucht, es auszuschließen und vert.x zu verwenden. Wenn ich also Spring Admin einbaue, begannen Probleme

<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

Vermutlich fehlt Ihnen @SpringBootApplication in Ihrer Spring Boot Starter-Klasse.

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}
0
vishal thakur

Ich hatte diese Ausnahme in der folgenden Situation.

in meinem POM waren Eigenschaften:

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

und der Name und der Pfad meiner Anwendungsklasse ("Startklasse") war falsch. 

0
Igor

Ich hatte ein ähnliches Problem und das Problem war eine defekte Repo-Jar-Datei. In meinem Fall war die Tomcat-embed-core-JAR-Datei defekt. Also habe ich es aus dem Repertoire entfernt und zum erneuten Herunterladen aktualisiert.

0
rokwoon kim

Eine weitere Ursache für dieses Problem ist die Beschädigung von Repository-Dosen von Maven. Sie können den folgenden Befehl verwenden, um das Problem zu lösen: 

mvn dependency:purge-local-repository
0

Ich bin mit demselben Problem geblieben. Da ich Main.class und die folgenden Anmerkungen in Spring-Boot nicht mit Maven definiert habe:

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