스프링 부트 : EmbeddedServletContainerFactory 빈 누락으로 인해 EmbeddedWebApplicationContext를 시작할 수 없음


173

나는 Spring을 완전히 처음 접 했고이 사이트에서 공식 가이드를 시작했습니다. https://spring.io/guides

이 가이드를하고 싶습니다 : https://spring.io/guides/gs/scheduling-tasks/

다음과 같은 예외가 발생합니다.

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

응용 프로그램 시작 클래스는 다음과 같습니다.

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

보시다시피, 주요 메소드에는 주석 처리 된 행이 있습니다. 이미 튜토리얼을 완료했습니다. https://spring.io/guides/gs/ consumer-rest / 실행 중입니다. 그러나 다음과 같은 ScheduledTasks 앱을 실행할 수 없습니다.

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

Eclipse를 사용하고 Application.java의 main을 Application으로 실행합니다. 누군가 제발 도와주세요?

답변:


66

스케줄링 가이드는 웹 앱이 아니므로 REST 가이드의 pom.xml에 썩은 내용이 있습니까? 지침을 자세히 따르면 제대로 작동합니다. 위에 게시 한 코드의 또 다른 잠재적 인 문제는 @EnableAutoConfiguration클래스가 컨텍스트에서 주된 방법으로 만 사용되지 않는다는 것입니다 (스케줄링 가이드에는 문제가되지 않지만 다른 많은 사람들에게는 문제 일 수 있음).


1
하나의 거대한 pom으로 끝나는 하나의 Eclipse 프로젝트에 대한 모든 자습서를 수행하고 있습니다. 튜토리얼의 pom을 사용하여 별도의 프로젝트에 넣었으며 이제 완벽하게 작동합니다. 당신의 도움을 주셔서 감사합니다! 이 API를 사용하여 Spring webapp에서 스케줄러를 원하면 어떻게합니까? 난 못해?
Kumite

소스의 당신은 그것을 할 수 있습니다. 그러나 웹 응용 프로그램에 대한 모든 종속성이 필요합니다.
Dave Syer

1
그러나 스레드 오프닝에서 볼 수있는 예외가 발생합니다. 죄송합니다. 뭔가 빠진 것 같습니다. "나쁜"pom.xml을 여기에 게시해야합니까?
Kumite

1
"좋은"pom은 "spring-boot-starter-web"(편의를 위해) 또는 스타터에 포함 된 모든 종속성을 개별적으로 나열합니다. 당신이 그들을 가지고 있는지 확인하십시오. 또한 에 코드 를 포함시켜야 @EnableAutoConfiguration합니다 SpringApplication(위의 코드 스 니펫은 그렇지 않습니다).
Dave Syer

6
완벽하게 작동합니다. 충분히 감사 할 수 없습니다. 그리고 그것을 작동시키기 위해서 SpringApplication의 run 메소드에 Object 배열로 실행할 클래스를 추가해야했습니다.SpringApplication.run(new Object[]{Application.class, ScheduledTasks.class}, args);
Kumite

48

@SpringBootApplication쇼를 스캔 하면 다음과 같은 주석이 포함됩니다.

@Configuration
@ComponentScan
@EnableAutoConfiguration

그래서 당신도 이것을 할 수 있습니다 :

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

29

pom.xml에서 이것을 사용하십시오 :

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

또는 이것 :

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

1
2 병을 추가하면 나에게도 효과가있었습니다. 나는 그래도 둘 다를 사용해야했다
Fafore Tunde

1
@FaforeTunde 그것은 좋은 징조가 아니며, 의존성 트리를 살펴보고 <scope> 태그를 사용했는지 확인하십시오.
Pasha GR

27

하나의 Spring Boot 프로젝트에 여러 개의 응용 프로그램 클래스가 있었는데 웹에 포함되어 있고 그중 하나에 대한 웹 환경을 구성하지 않기 위해 수동으로 구성했습니다.

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

스프링 부트 2 이상 업데이트 :

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

23

이 시도

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

20

이 오류는 실행하려는 응용 프로그램이 Apache Tomcat 인스턴스를 인스턴스화 할 수 없음을 나타냅니다. 바람둥이로 응용 프로그램을 실행하고 있는지 확인하십시오.

모든 종속성을 확인한 후에도 동일한 문제가 발생하면 구성 클래스에 다음을 추가하십시오.

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

Tomcat의 외부 인스턴스 (특히 intellij)를 사용하는 경우 IDE에서 내장 Tomcat을 시작하려고 할 때 문제가 발생할 수 있습니다. 이 경우 pom.xml에서 다음을 제거하고 '구성 편집'마법사를 사용하여 외부 바람둥이를 구성하십시오.

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

2
좋은 답변입니다! 내 문제가 해결되었습니다. 그러나 그것은 intellij에서 일하고있었습니다. maven shade plugin을 사용하여 jar을 만들 때 동일한 클래스 경로가 만들어 졌으므로 실제로 무슨 일이 있었는지 이해할 수 없습니다.
견습생

14

더하다

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

8

intellij를 사용하는 동안이 예외가 발생하고 run버튼으로 응용 프로그램을 시작하려고하는 경우 대신 명령 행에서 응용 프로그램을 시작하십시오. 예를 들어 springboot응용 프로그램 실행 이라고 가정하고 올바른 디렉토리 (pom 파일이있는 디렉토리)에 있는지 확인하십시오mvn spring-boot:run 하십시오.

또한 스프링 응용 프로그램이 다른 응용 프로그램에 의존 할 때이 오류가 발생하는 것을 보았습니다. 이 경우 다른 응용 프로그램을 먼저 시작한 다음 실행해야했습니다.


1
다시 시작 인 IntelliJ (여기 궁극적 인 2016.3)는 나를 위해 그것을 고정
mangusbrother

위의 Marquis 주어진 솔루션 외에도 필자는 mvn 및 jdk 조합의 올바른 버전을 선택하여mvn spring-boot:run
lnarasimhan

6

주석 추가 @SpringBootApplication초보자 클래스 가이 문제를 해결하기 전에 (실제로이 오류 메시지는 " @SpringBootApplication어디에 든 표시된 클래스 가 없으며 적어도 하나가 필요합니다 "를 의미 할 수 있음 )

@SpringBootApplication
public class AppStarter {

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

4

메인 메소드가 SpringApplcation.run ()에 전달 된 클래스와 다른 클래스에있을 때 비슷한 문제가 있습니다.

따라서 해결책은 주석 처리 한 줄을 사용하는 것입니다.

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

3

단일 jar로 패키지하고 웹 앱이 아닌 경우 아래처럼 앱 컨텍스트를로드하십시오.

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

또는 아래 플러그인을 사용하여 단일 항아리로 패키지하십시오.

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

아래 명령을 사용하여 외부 구성을 지정할 수 있습니다

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

속성을 인수로 전달하는 경우 포함하지 않으면 @PropertySource("classpath:test.properties")매개 변수가 재정의됩니다.


spring-boot-maven-plugin과 <phase> package </ phase>를 추가하고 mvn clean package로 앱을 실행하면 나에게 도움이되었습니다.
hipokito

2

커맨드 라인을 사용하여 성공적으로 실행하면 gradle bootRun커맨드 라인 gradle jar으로 jar 파일로 패키징하는 동안 커맨드 라인 으로 실행하기 위해 java -jar build/libs/demo.jar불행히도 Exception :으로 실패했습니다. Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean이 경우 bootRepackagegradle 플러그인 작업을 사용 spring-boot하여 특수 파일을 생성 해야합니다 실행 가능한 항아리.

  • 설정 1

    $ gradle 클린 부팅

  • 설정 2

    $ java -jar 빌드 /libs/demo.jar


왜 그런지 모르겠지만 gradle clean bootRepackage 나를 도왔습니다. 이전에는 모든 캐시 및 빌드 폴더를 수동으로 정리했습니다.
Andrii Abramov

2

A SpringApplicationApplicationContext귀하를 대신하여 올바른 유형을 만들려고 시도합니다 . 기본적으로 AnnotationConfigApplicationContext또는AnnotationConfigEmbeddedWebApplicationContext 웹 응용 프로그램을 개발하거나하지 여부에 따라 사용됩니다.

'웹 환경'을 결정하는 데 사용되는 알고리즘은 상당히 단순합니다 (몇 가지 클래스가 있음을 기반으로 함). 당신이 사용할 수있는setWebEnvironment(boolean webEnvironment)기본값을 대체해야하는 경우 .

ApplicationContext전화를 통해 사용될 유형을 완전히 제어 할 수도 있습니다.setApplicationContextClass(…​) .

[팁] JUnit 테스트 내에서 setWebEnvironment(false)사용할 때 전화하는 것이 종종 바람직합니다 SpringApplication.


를 통해 응용 프로그램을 만들 때 setWebEnvironment를 어떻게 사용 SpringApplication.run(Application.class, args);합니까?
tgdavies

@tgdavies 위의 답변을 참조하십시오.SpringApplicationBuilder
Robert Hunt

2

스프링 부트 스타터 의존성을 추가하면 오류가 수정되었습니다.

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

내장 된 서버로 바람둥이를 시작하려는 경우에 필요합니다.


2

pom.xml이 있는지 확인하십시오.

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

나는 이런 문제를 겪었다.


이것은 내 문제를 해결합니다.
lenhhoxung

1

필자의 경우 @Profile 주석을 새로 추가했습니다. 프로덕션 모드의 TestApplication 클래스와 테스트 모드의 Application 클래스를 무시하기 위해 .

불행히도 application.properties 파일에 다음 줄을 추가하는 것을 잊었습니다.

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

이 구성이 없으면 프로파일이로드되지 않아 스프링 오류가 발생하지 않았습니다.


@Profile 주석을 모두 제공하고 프로필을 jvm에 전달하면이 오류가 발생할 수 있다고 덧붙이고 싶습니다.
날씬한

1

이는 종속성 문제로 인해 발생해야하며 일반적으로 종속성을 확인해야합니다.


1

이 수업에서 문제는 :

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

응용 프로그램을 시작하는 올바른 방법은 다음과 같습니다.

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

1

명확한 저장소 는 하나의 가능한 솔루션입니다.

Windows-> maven 저장소의 모든 하위 폴더를 삭제하십시오.

C : \ Users \ YourUserName.m2 \ repository


Java Spring에서 PluralSight 튜토리얼을 따르는 사람에게는 이것이 나를 위해 일한 유일한 솔루션입니다!
Janac Meena

1

나는 같은 문제에 봉착했다. Maven을 사용하여 Spring-Boot에서 Main.class와 다음 주석을 정의하지 않았으므로

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

0

문제는 시동기 바람둥이를 배제하는 것입니다. 배제하려고 시도하고 vert.x를 사용하므로 Spring Admin을 통합 할 때 문제가 시작되었습니다.

<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

다음과 같은 상황 에서이 예외가 발생했습니다.

내 POM에서 속성은 다음과 같습니다.

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

내 응용 프로그램 클래스의 이름과 경로 ( "start-class")가 잘못되었습니다.


0

비슷한 문제가 있었고 문제는 깨진 maven repo jar 파일이었습니다. 제 경우에는 tomcat-embed-corejar 파일이 손상되었습니다. 그래서 나는 그것을 maven repo에서 제거하고 다시 다운로드하기 위해 새로 고쳤다.


] 답변을 올바르게 수정하고 형식을 지정하려면 서식 도구를 사용하십시오.
Morse

0

필자의 경우 pom다음 코드를 사용하여 리소스 폴더를 제외 한 후에 발생 합니다.

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

이 코드를 주석 처리하면 코드가 시작되었습니다.


0

이 문제점의 다른 원인은 maven 저장소 jar의 손상으로 다음 명령을 사용하여 문제점을 해결할 수 있습니다.

mvn dependency:purge-local-repository

0

아마도 스프링 부트 스타터 클래스에서 @SpringBootApplication 이 누락 되었을 것 입니다.

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}

0

나는 gradle을 사용하고 있는데 commandLineRunner가 kafka 주제를 사용하고 수신 후크를 수신하기 위해 상태 검사 엔드 포인트를 사용할 때 문제가 발생하는 것처럼 보입니다. 나는 12 시간을 알아 내고 마침내 mybatis-spring-boot-starter를 spring-boot-starter-web과 함께 사용했으며 충돌이 있음을 발견했습니다. 나중에 나는 mybatis-spring-boot-starter 대신 mybatis-spring, mybatis 및 spring-jdbc를 직접 소개했으며 프로그램은 잘 작동했습니다.

도움이 되었기를 바랍니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.