Spring Boot:EmbeddedServletContainerFactory Beanが見つからないため、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);
    }
}

ご覧のとおり、mainメソッドにはコメント行が含まれています。私はすでにチュートリアル、つまり次のチュートリアル を実行しました:https : //spring.io/guides/gs/sumption-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のメインをアプリケーションとして実行します。誰かが私を助けてくれませんか?

回答:


66

スケジュールガイドはWebアプリではないので、おそらくRESTガイドのpom.xmlにカビの生えたものがありますか?指示に厳密に従うと、うまくいくはずです。上記で投稿したコードのもう1つの潜在的な問題は、@EnableAutoConfigurationクラスがコンテキストで使用されておらず、メインメソッドとしてのみ使用されていることです(これは、スケジューリングガイドでは問題にならないかもしれませんが、おそらく他の人にとっては問題です)。


1
私はすべてのチュートリアルを1つのEclipseプロジェクトにして、最終的に1つの巨大なpomを作成します。チュートリアルのpomを使用して別のプロジェクトに配置しましたが、完全に機能します。ご協力いただきありがとうございます!このAPIを使用してSpring webappでスケジューラが必要な場合はどうなりますか?できないの?
組手2014

ソースのあなたはそれを行うことができます。しかし、その場合、Webアプリケーションのすべての依存関係が必要になります。
Dave Syer 2014

1
しかし、私はあなたがスレッドのオープニングで見ることができる例外を持っています。すみません、何か不足しています。「悪い」pom.xmlをここに投稿する必要がありますか?
組手2014

1
「良い」pomには「spring-boot-starter-web」(便宜上)、または個別にリストされたスターターに含まれるすべての依存関係があります。あなたがそれらを持っていることを確認してください。また、をに含めて@EnableAutoConfigurationくださいSpringApplication(上記のコードスニペットには含まれません)。
Dave Syer 14

6
申し分なく動作します。そして、それは私がSpringApplicationのrunメソッドにオブジェクトの配列で実行するようにクラスを追加しなければならなかった仕事を取得しますSpringApplication.run(new Object[]{Application.class, ScheduledTasks.class}, args);
組手

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つのjarを追加することも私にとってはうまくいきました。私は両方を使用しなければなりませんでした
Fafore Tunde 2018

1
@FaforeTundeこれは良い兆候ではありません。依存関係ツリーを調べ、その中で<scope>タグが使用されているかどうかを確認してください。
Pasha GR

27

Webが含まれている1つのSpring Bootプロジェクトに複数のアプリケーションクラスがあり、そのうちの1つのWeb環境を構成しないようにしたいので、以下のように手動で構成しました。

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

Spring Boot 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のインスタンスをインスタンス化できないことを示唆しています。tomcatでアプリケーションを実行していることを確認してください。

すべての依存関係を確認した後、同じ問題が発生する場合は、構成クラスに以下を追加してみてください

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

tomcatの外部インスタンス(特にintellijの場合)を使用している場合、問題はIDEが組み込みのTomcatを起動しようとしていることである可能性があります。この場合、pom.xmlから以下を削除し、「設定の編集」ウィザードを使用して外部Tomcatを設定します。

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

2
正解です。それは私の問題を解決しました。しかしそれはintellijで働いていました。Mavenシェードプラグインを使用してjarを作成すると、同じクラスパスが作成されたため、何が起こったのか本当に理解できません。
見習い

14

追加

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

8

intellijの使用中にこの例外が発生し、runボタンでアプリケーションを起動しようとした場合。代わりに、コマンドラインからアプリケーションを起動してみてください。たとえば、これがspringbootアプリケーションの実行であると仮定して、正しいディレクトリ(pomファイルのあるディレクトリ)にいることを確認mvn spring-boot:runしてください。

さらに、Springアプリケーションが別のアプリケーションに依存しているときにこのエラーが発生することも確認しました。この場合、最初に他のアプリケーションを起動してから実行する必要がありました。


1
IntelliJを再
起動する

上記のMarquisのソリューションに加えて、mvnとjdkの組み合わせの正しいバージョンを選択して、mvn spring-boot:run
lnarasimhan

6

注釈の追加@SpringBootApplicationスタータークラスがこの問題を修正する前に(つまり、このエラーメッセージは、「@SpringBootApplicationマークされたクラスがどこにもないため、少なくとも1つ必要です)を意味します。

@SpringBootApplication
public class AppStarter {

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

4

mainメソッドがSpringApplcation.run()に渡されたクラスとは異なるクラスにある場合、同様の問題が発生しました

したがって、解決策は、コメントアウトした行を使用することです。

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

3

単一のjarとしてパッケージ化し、それが非Webアプリである場合は、以下のようにアプリコンテキストをロードしてみてください。

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

または、以下のプラグインを使用して単一のjarとしてパッケージ化します

             <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でアプリを実行するとうまくいきました。
ヒポキト2016

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特殊実行可能なjar。

  • セットアップ1

    $ gradle clean bootRepackage

  • セットアップ2

    $ java -jar build / libs / demo.jar


理由はgradle clean bootRepackage わかりませんが、助けてくれました。以前は、すべてのキャッシュとビルドフォルダーを手動でクリーンアップしていました。
Andrii Abramov 2017

2

Aは、SpringApplication正しいタイプを作成しようとしますApplicationContext、あなたに代わって。デフォルトでは、Webアプリケーションを開発しているかどうかに応じて、AnnotationConfigApplicationContextまたはAnnotationConfigEmbeddedWebApplicationContextが使用されます。

「Web環境」を決定するために使用されるアルゴリズムは、かなり単純です(いくつかのクラスの存在に基づく)。setWebEnvironment(boolean webEnvironment)デフォルトを上書きする必要がある場合に使用できます。

ApplicationContext呼び出すことによって使用されるタイプを完全に制御することも可能setApplicationContextClass(…​)です。

[ヒント]多くの場合、JUnitテスト内でsetWebEnvironment(false)使用SpringApplicationするときに呼び出すことが望ましいです。


経由でアプリケーションを作成するときに、setWebEnvironmentをどのように使用しますSpringApplication.run(Application.class, args);か?
tgdavies

@tgdaviesが上記の私の回答を参照してください。SpringApplicationBuilder
ロバートハントを

2

Spring Boot Starterの依存関係を追加すると、エラーが修正されました。

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

これは、組み込みサーバーとしてTomcatを起動する場合に必要です。


2

pom.xmlが存在することを確認してください

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

私はこのような問題を抱えていました;この依存関係がないために


これは私の問題を修正します。
lenhhoxung 2017年

1

私の場合、プロダクションモードのTestApplicationクラスとテストモードのApplicationクラスを無視するために、@ Profileアノテーションを新しく追加しました

残念ながら、application.propertiesファイルに次の行を追加するのを忘れていました。

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

これらの設定がないと、プロファイルがロードされなかったため、それほど多くはありませんでしたSpringエラーが発生しました。


@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

明確なリポジトリは、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

問題はスターターTomcatの除外です、私はそれを除外して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リポジトリから削除し、更新して再度ダウンロードしました。


]回答を適切に編集およびフォーマットするには、フォーマットツールを使用してください。
モールス

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.