Spring Boot: Tidak dapat memulai EmbeddedWebApplicationContext karena tidak ada EmbeddedServletContainerFactory bean

173

Saya benar-benar baru ke Spring dan mulai melakukan panduan resmi dari situs ini: https://spring.io/guides

Saya ingin melakukan panduan ini: https://spring.io/guides/gs/scheduling-tasks/

Saya mendapatkan Pengecualian berikut:

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

Kelas aplikasi pemula adalah ini:

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

Seperti yang Anda lihat, metode utama berisi baris komentar. Saya sudah melakukan tutorial, yaitu yang ini: https://spring.io/guides/gs/consuming-rest/ Sudah aktif dan berjalan. Tapi saya tidak bisa menjalankan aplikasi ScheduledTasks, yang adalah sebagai berikut:

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

Saya menggunakan Eclipse dan menjalankan utama Application.java sebagai Aplikasi. Bisakah seseorang tolong saya?

Kumite
sumber

Jawaban:

66

Panduan penjadwalan bukan aplikasi web sehingga Anda mungkin memiliki beberapa barang berjamur di pom.xml Anda dari panduan REST? Jika Anda mengikuti instruksi dengan seksama itu harus bekerja. Masalah potensial lain dengan kode yang Anda posting di atas adalah bahwa @EnableAutoConfigurationkelas Anda tidak digunakan dalam konteks, hanya sebagai metode utama (yang mungkin tidak menjadi masalah bagi panduan penjadwalan tetapi mungkin untuk sekelompok orang lain).

Dave Syer
sumber
1
Saya melakukan semua tutorial menjadi satu proyek Eclipse yang berakhir dengan satu pom raksasa. Saya meletakkannya di proyek terpisah menggunakan pom dari tutorial dan sekarang berfungsi dengan baik. Terima kasih atas bantuan Anda! Bagaimana jika saya ingin penjadwal di webapp Spring menggunakan API ini? Saya tidak bisa melakukan itu?
Kumite
Dari sumber Anda dapat melakukannya. Tapi kemudian Anda akan membutuhkan semua dependensi untuk aplikasi web.
Dave Syer
1
Tapi kemudian saya berakhir dengan Pengecualian yang dapat Anda lihat di pembukaan utas. Maaf, saya pikir saya kehilangan sesuatu. Haruskah saya memposting pom.xml "buruk" di sini?
Kumite
1
Pom "baik" akan memiliki "spring-boot-starter-web" (untuk kenyamanan) atau semua dependensi yang termasuk dalam starter terdaftar secara individual. Pastikan Anda memilikinya. Pastikan juga Anda memasukkan @EnableAutoConfigurationdalam SpringApplication(cuplikan kode di atas tidak).
Dave Syer
6
Berfungsi dengan sempurna, saya tidak bisa cukup berterima kasih. Dan untuk membuatnya bekerja, saya harus menambahkan kelas untuk dijalankan dalam array Obyek ke metode menjalankan SpringApplication:SpringApplication.run(new Object[]{Application.class, ScheduledTasks.class}, args);
Kumite
48

Pemindaian @SpringBootApplication acara yang menyertakan anotasi berikut:

@Configuration
@ComponentScan
@EnableAutoConfiguration

Jadi Anda bisa melakukan ini juga:

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

gunakan yang ini di pom.xml Anda:

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

atau yang ini:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
Pasha GR
sumber
1
Menambahkan 2 toples juga bermanfaat bagi saya. Saya harus menggunakan keduanya
Fafore Tunde
1
@FaforeTunde ini bukan pertanda baik, lihat pohon dependensi Anda dan periksa apakah Anda telah menggunakan tag <scope> di dalamnya.
Pasha GR
27

Saya memiliki beberapa kelas aplikasi dalam satu proyek Boot Spring yang webnya sudah mulai disertakan dan ingin menghindarinya mengkonfigurasi lingkungan web untuk salah satu dari mereka jadi saya mengkonfigurasi secara manual seperti di bawah ini:

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

UPDATE untuk Spring Boot 2 dan lebih tinggi:

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

Coba ini

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

Kesalahan menunjukkan bahwa aplikasi yang Anda coba jalankan tidak dapat membuat instance dari apache tomcat. Pastikan Anda menjalankan aplikasi dengan kucing jantan.

jika setelah memeriksa semua dependensi Anda, Anda mengalami masalah yang sama, cobalah untuk menambahkan berikut ini di kelas konfigurasi Anda

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

Jika Anda menggunakan turunan eksternal tomcat (terutama untuk intellij), masalahnya mungkin karena IDE sedang mencoba memulai tomcat yang disematkan. Dalam hal ini, hapus yang berikut dari pom.xml Anda lalu konfigurasikan kucing jantan eksternal menggunakan wizard 'Edit Konfigurasi'.

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-tomcat</artifactId>
     <scope>provided</scope>
</dependency> 
Thomas Mwania
sumber
2
Jawaban bagus! Itu memecahkan masalah saya. Namun itu berhasil di intellij. Ketika saya membuat toples menggunakan plugin maven shade, classpath yang sama dibuat jadi saya tidak benar-benar mengerti apa yang terjadi.
apprentice
14

Menambahkan

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

jika Anda mengalami pengecualian ini saat menggunakan intellij dan Anda mencoba memulai aplikasi dengan runtombol. Coba mulai aplikasi dari baris perintah saja. Misalnya memastikan bahwa Anda berada di direktori yang benar (direktori dengan file pom Anda) dengan asumsi ini adalah springbootaplikasi yang dijalankanmvn spring-boot:run ini melakukan trik untuk saya.

Selain itu saya juga melihat kesalahan ini terjadi ketika aplikasi pegas Anda bergantung pada aplikasi lain. Dalam hal ini saya harus memulai aplikasi lain terlebih dahulu kemudian jalankan.

Marquis Blount
sumber
1
Restart IntelliJ (Ultimate 2016.3 di sini) memperbaikinya untuk saya
mangusbrother
Selain solusi yang diberikan Marquis di atas, saya memastikan saya memilih versi yang tepat dari kombinasi mvn dan jdk untuk menjalankanmvn spring-boot:run
lnarasimhan
6

Menambahkan anotasi @SpringBootApplicationSebelum kelas pemula memperbaiki masalah ini untuk saya (jadi pada dasarnya, pesan kesalahan ini dapat berarti "Anda tidak memiliki @SpringBootApplicationkelas yang ditandai di mana pun, Anda memerlukan setidaknya satu)

@SpringBootApplication
public class AppStarter {

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

Saya punya masalah serupa ketika metode utama pada kelas yang berbeda dari yang diteruskan ke SpringApplcation.run ()

Jadi solusinya adalah menggunakan baris yang Anda komentari:

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

Jika Anda mengemasnya sebagai satu toples dan itu bukan aplikasi web, cobalah memuat konteks aplikasi seperti di bawah ini.

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

Atau gunakan plugin di bawah ini untuk mengemas sebagai satu toples

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

Anda dapat menentukan konfigurasi eksternal dengan menggunakan perintah di bawah ini untuk menjalankan

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

Perhatikan bahwa jika Anda meneruskan properti sebagai argumen maka jangan menyertakannya @PropertySource("classpath:test.properties")akan menimpa parameter

Pavan Kumar Patil
sumber
Menambahkan paket spring-boot-maven-plugin dan <phase> </phase> dan kemudian menjalankan aplikasi sebagai paket mvn clean bekerja untuk saya.
hipokito
2

Jika Anda menjalankannya dengan sukses menggunakan baris perintah gradle bootRun, sementara mengemasnya dengan baris perintah gradle jarke file jar untuk menjalankannya dengan baris perintah java -jar build/libs/demo.jar, sayangnya, gagal dengan Pengecualian :, Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory beandalam hal ini, Anda perlu menggunakan tugas bootRepackageplugin gradle spring-bootuntuk menghasilkan khusus jar runnable.

  • pengaturan 1

    bootRepackage $ gradle clean

  • pengaturan 2

    $ java -jar build / libs / demo.jar

Binhong Wu
sumber
Saya tidak tahu mengapa, tetapi gradle clean bootRepackage membantu saya. Sebelumnya, saya telah secara manual membersihkan semua cache dan membangun folder.
Andrii Abramov
2

A SpringApplicationakan berusaha membuat jenis yang tepat ApplicationContextatas nama Anda. Secara default, suatu AnnotationConfigApplicationContextatauAnnotationConfigEmbeddedWebApplicationContext akan digunakan, tergantung pada apakah Anda sedang mengembangkan aplikasi web atau tidak.

Algoritma yang digunakan untuk menentukan 'lingkungan web' cukup sederhana (berdasarkan pada kehadiran beberapa kelas). Kamu bisa memakaisetWebEnvironment(boolean webEnvironment) jika Anda perlu mengganti default.

Dimungkinkan juga untuk mengambil kendali penuh dari ApplicationContexttipe yang akan digunakan dengan memanggilsetApplicationContextClass(…​) .

[Tip] Sering diinginkan untuk menelepon setWebEnvironment(false)saat menggunakan SpringApplicationdalam tes JUnit.

Leimbag
sumber
Bagaimana Anda menggunakan setWebEnvironment saat membuat aplikasi melalui SpringApplication.run(Application.class, args);?
tgdavies
@tgdavies melihat jawaban saya di atas, Anda dapat menggunakanSpringApplicationBuilder
Robert Hunt
2

Menambahkan dependensi mulai booting semi memperbaiki kesalahan saya.

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

Ini diperlukan jika Anda ingin memulai kucing jantan sebagai server yang diembed.

Gulzar Hemani
sumber
2

periksa pom.xml Anda ada

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

Saya punya masalah seperti ini ; Karena kekurangan ketergantungan ini

chao.lv
sumber
Ini memperbaiki masalah saya.
lenhhoxung
1

Dalam kasus saya, kami menambahkan anotasi @Profile baru untuk mengabaikan kelas TestApplication dalam mode produksi dan kelas Aplikasi dalam mode uji.

Sayangnya, kami lupa menambahkan baris berikut ke file application.properties:

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

Tanpa konfigurasi ini, tidak ada profil yang dimuat yang menyebabkan Spring Error mengatakan tidak begitu banyak.

hb0
sumber
Saya ingin menambahkan bahwa Anda juga bisa mendapatkan kesalahan ini jika Anda memberikan anotasi @Profile dan meneruskan profil ke jvm.
langsing
1

Ini harus disebabkan oleh masalah ketergantungan, secara umum, Anda perlu memeriksa ketergantungan.

richard
sumber
1

Masalahnya ada di kelas ini:

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

Cara yang benar untuk meluncurkan aplikasi Anda adalah:

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

Bersihkan gudang adalah salah satu solusi yang memungkinkan.

Windows -> hapus semua subfolder di repositori maven:

C: \ Users \ YourUserName.m2 \ repositori

Sergey Chepurnov
sumber
Bagi siapa pun yang mengikuti tutorial PluralSight di Java Spring, ini adalah satu-satunya solusi yang bekerja untuk saya!
Janac Meena
1

Saya terjebak dengan masalah yang sama. Karena saya tidak mendefinisikan Main.class dan anotasi berikut di Spring-Boot menggunakan Maven:

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

Masalahnya adalah pengecualian dari starter tomcat, saya mencoba mengecualikannya dan menggunakan vert.x, jadi ketika saya mengintegrasikan dengan Spring Admin, masalah mulai

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

Saya memiliki Pengecualian ini dalam situasi berikut.

di POM saya adalah properti:

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

dan nama dan jalur kelas aplikasi saya ("kelas awal") salah.

Igor
sumber
0

Saya memiliki masalah serupa dan masalahnya adalah file jar repo pakar rusak. Dalam kasus saya, tomcat-embed-corefile jar rusak. Jadi saya menghapusnya dari repo pakar dan menyegarkannya untuk mengunduh lagi.

rokwoon kim
sumber
] Silakan gunakan alat pemformatan untuk mengedit dan memformat jawaban Anda dengan benar.
Morse
0

Dalam kasus saya itu terjadi setelah mengecualikan folder sumber daya dari pommenggunakan kode berikut.

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

Mengomentari kode ini memulai kode saya.

Akar
sumber
0

Penyebab lain dari masalah ini adalah korupsi pada toples penyimpanan maven sehingga Anda bisa menggunakan perintah berikut untuk memecahkan masalah:

mvn dependency:purge-local-repository
Abdessattar NOISSI
sumber
0

Mungkin Anda melewatkan @SpringBootApplication di kelas starter boot spring Anda.

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}
thakur vishal
sumber
0

Saya menggunakan gradle, bertemu tampaknya masalah ketika saya memiliki commandLineRunner mengkonsumsi topik kafka dan titik akhir pemeriksaan kesehatan untuk menerima kait yang masuk. Saya menghabiskan 12 jam untuk mencari tahu, akhirnya menemukan bahwa saya menggunakan mybatis-spring-boot-starter dengan spring-boot-starter-web, dan mereka memiliki beberapa konflik. Belakangan saya langsung memperkenalkan mybatis-spring, mybatis dan spring-jdbc daripada mybatis-spring-boot-starter, dan program ini bekerja dengan baik.

semoga ini membantu

professorrj
sumber