Bahar Önyükleme: EmbeddedServletContainerFactory fasulyesi eksik olduğu için EmbeddedWebApplicationContext başlatılamıyor


173

İlkbaharda tamamen yeniyim ve bu siteden resmi rehberler yapmaya başladım: https://spring.io/guides

Bu kılavuzu yapmak istiyorum: https://spring.io/guides/gs/scheduling-tasks/

Aşağıdaki İstisna olsun:

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

Uygulama başlangıç ​​sınıfı şudur:

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

Gördüğünüz gibi, ana yöntem yorumlanmış bir satır içerir. Zaten bir öğretici yaptım, yani bu: https://spring.io/guides/gs/consuming-rest/ Çalışıyor. Ancak aşağıdaki olan ScheduledTasks uygulamasını çalıştıramıyorum:

@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 kullanıyorum ve Application.java ana uygulama olarak çalıştırın. Birisi bana yardım edebilir mi?

Yanıtlar:


66

Zamanlama kılavuzu bir web uygulaması değil, bu yüzden muhtemelen REST kılavuzundan pom.xml dosyasında bazı küflü şeyler var? Talimatları yakından takip ederseniz işe yarayacaktır. Yukarıda yayınladığınız kodla ilgili bir başka potansiyel sorun da, @EnableAutoConfigurationsınıfınızın bağlamda kullanılmaması, yalnızca ana yöntem olarak (programlama kılavuzu için bir sorun olmayabilir, ancak muhtemelen bir grup diğerleri için) olmasıdır.


1
Tüm öğreticileri bir dev pom ile biten bir Eclipse projesine yapıyorum. Ben öğretici pom kullanarak ayrı bir proje koymak ve şimdi mükemmel çalışıyor. Yardımınız için teşekkürler! Bu API'yı kullanarak bir Bahar web uygulamasında bir zamanlayıcı istersem ne olur? Bunu yapamam?
Kumite

Kaynak olarak bunu yapabilirsiniz. Ama sonra bir webapp için tüm bağımlılıklara ihtiyacınız olacak.
Dave Syer

1
Ama sonra iş parçacığı açılışında görebileceğiniz istisna sahip. Üzgünüm, sanırım bir şey eksik. "Kötü" pom.xml'yi buraya mı göndermeliyim?
Kumite

1
"İyi" bir pom, "yay önyükleme marş-ağı" na (kolaylık sağlamak için) ya da ayrı olarak listelenen marş motorunda bulunan tüm bağımlılıklara sahip olacaktır. Sadece onlara sahip olduğunuzu kontrol edin. Ayrıca emin bir içerme yapmak @EnableAutoConfigurationsizin içinde SpringApplication(kod yukarıdaki gelmez snippet'iniz).
Dave Syer

6
Mükemmel çalışıyor, sana yeterince teşekkür edemem. Ve işe almak için ben SpringApplication çalışma yöntemine bir Object dizi çalıştırmak için sınıfları eklemek zorunda kaldı:SpringApplication.run(new Object[]{Application.class, ScheduledTasks.class}, args);
Kumite

48

@SpringBootApplicationŞovun aşağıdaki ek açıklamaları içerdiği taraması :

@Configuration
@ComponentScan
@EnableAutoConfiguration

Böylece bunu da yapabilirsiniz:

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

29

Bunu pom.xml dosyasında kullanın:

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

ya da bu :

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

1
2 kavanoz eklemek benim için de çalıştı. Her ikisini de kullanmak zorunda kaldım
Fafore Tunde

1
@FaforeTunde iyi bir işaret değil, bağımlılık ağacınıza bir göz atın ve içinde <scope> etiketi kullanıp kullanmadığınızı kontrol edin.
Pasha GR

27

Web'i dahil etmeye başlamış ve bunlardan biri için bir web ortamını yapılandırmaktan kaçınmak isteyen bir Spring Boot projesinde birden fazla uygulama sınıfım vardı, bu yüzden manuel olarak aşağıdaki gibi yapılandırdım:

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

Spring Boot 2 ve üstü için GÜNCELLEME :

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

23

Bunu dene

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

20

Hata, çalıştırmaya çalıştığınız uygulamanın apache tomcat örneğini başlatamadığını gösterir. Uygulamayı tomcat ile çalıştırdığınızdan emin olun.

tüm bağımlılıklarınızı kontrol ettikten sonra aynı sorunu yaşıyorsanız, yapılandırma sınıfınıza aşağıdakileri eklemeyi deneyin

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

Harici bir tomcat örneği kullanıyorsanız (özellikle intellij için), sorun IDE'nin gömülü tomcat'i başlatmaya çalışması olabilir. Bu durumda, pom.xml'nizden aşağıdakileri kaldırın, ardından 'Yapılandırmaları Düzenle' sihirbazını kullanarak harici tomcat'i yapılandırın.

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

2
Mükemmel cevap! Sorunumu çözdü. Ancak intellij'de çalışıyordu. Kavanoz maven gölge eklentisini kullanarak oluşturduğumda, aynı sınıf yolu yaratıldı, böylece ne olduğunu gerçekten anlamıyorum.
çırak

14

Ekle

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

8

intellij kullanırken bu istisnayı yaşıyorsanız ve uygulamayı rundüğmeyle başlatmaya çalışıyorsanız . Bunun yerine uygulamayı komut satırından başlatmayı deneyin. Örneğin bu benim için hile yaptı bir springbootuygulama çalışması olduğunu varsayarak doğru dizinde (pom dosyası ile dizin) olduğundan emin olun mvn spring-boot:run.

Ayrıca bahar uygulamanız başka bir uygulamaya bağlı olduğunda da bu hatayı gördüm. Bu durumda önce diğer uygulamayı başlatmak ve sonra çalıştırmak zorunda kaldı.


1
IntelliJ'i yeniden başlatmak (Ultimate 2016.3 burada) benim için düzeltti
mangusbrother

Yukarıdaki Marquis verilen çözüm ek olarak, benmvn spring-boot:run
lnarasimhan

6

Ek açıklama ekleme @SpringBootApplicationBaşlangıç ​​sınıfı bu sorunu benim için düzeltmeden önce (bu nedenle, bu hata mesajı " @SpringBootApplicationhiçbir yerde işaretli bir sınıfınız yok , en az birine ihtiyacınız var)

@SpringBootApplication
public class AppStarter {

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

4

Ana yöntem SpringApplcation.run () geçirilen farklı bir sınıfta olduğunda benzer sorunlar yaşadım

Dolayısıyla çözüm, yorum yaptığınız satırı kullanmak olacaktır:

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

3

Tek bir kavanoz olarak paketlerseniz ve web dışı bir uygulama ise, aşağıdaki gibi uygulama içeriğini yüklemeyi deneyin.

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

Veya tek bir kavanoz olarak paketlemek için aşağıdaki eklentiyi kullanın

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

çalıştırmak için aşağıdaki komutu kullanarak harici yapılandırmaları belirleyebilirsiniz

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

Özellikleri bağımsız değişken olarak @PropertySource("classpath:test.properties")geçiriyorsanız, parametreleri eklemediğinizi unutmayın.


Spring-boot-maven-plugin ve <phase> paketini </phase> eklemek ve sonra uygulamayı mvn clean paketi olarak çalıştırmak benim için çalıştı.
hipokito

2

Komut satırını kullanarak başarıyla çalıştırırsanız gradle bootRun, komut satırıyla gradle jarçalıştırmak için dosyayı jar komut satırına paketlerken java -jar build/libs/demo.jar, ne yazık ki, istisna ile başarısız oldu: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory beanbu durumda, özel oluşturmak için bootRepackagegradle eklentisi görevini kullanmanız gerekir spring-bootçalıştırılabilir kavanoz.

  • kurulum 1

    $ gradle temiz önyükleme

  • kurulum 2

    $ java -jar build / libs / demo.jar


Neden olduğu hakkında hiçbir fikrim yok ama gradle clean bootRepackage bana yardımcı oldu. Önceden, tüm önbelleği ve derleme klasörünü el ile temizledim.
Andrii Abramov

2

A , sizin adınıza SpringApplicationdoğru türü oluşturmaya çalışır ApplicationContext. Varsayılan olarak, bir web uygulaması geliştirip geliştirmediğinize bağlı olarak bir AnnotationConfigApplicationContextveya AnnotationConfigEmbeddedWebApplicationContextkullanılır.

Bir 'web ortamını' belirlemek için kullanılan algoritma oldukça basittir (birkaç sınıfın varlığına dayanarak). KullanabilirsinizsetWebEnvironment(boolean webEnvironment)Varsayılanı geçersiz kılmanız gerekirse .

Ayrıca, ApplicationContextçağrılarak kullanılacak türün tam kontrolünü almak da mümkündürsetApplicationContextClass(…​) .

[İpucu] Genellikle bir JUnit testi içinde setWebEnvironment(false)kullanırken aramak istenir SpringApplication.


Uygulama üzerinden oluştururken setWebEnvironment'ı nasıl kullanırsınız SpringApplication.run(Application.class, args);?
tgdavies

@tgdavies yukarıdaki cevabımı gör, kullanabilirsinizSpringApplicationBuilder
Robert Hunt

2

Yay önyükleme marş bağımlılığı eklemek hatayı düzeltti.

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

Tomcat'i gömülü sunucu olarak başlatmak istiyorsanız bu gereklidir.


2

pom.xml dosyanızın mevcut olup olmadığını kontrol edin

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

Böyle bir sorun yaşadım ; Bu bağımlılıktan yoksun olduğu için


Bu benim sorunumu çözer.
lenhhoxung

1

Benim durumumda , üretim modunda TestApplication sınıfını ve test modunda Application sınıfını yoksaymak için @Profile ek açıklamasını yeni ekledik .

Maalesef, application.properties dosyalarına aşağıdaki satırı eklemeyi unuttuk:

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

Bu yapılandırma olmadan, çok fazla olmayan Bahar Hatası'na neden olan profil yüklenmedi.


Hem @Profil ek açıklamasını sağlarsanız hem de profili jvm'ye iletirseniz bu hatayı alabileceğinizi de eklemek isterim.
ince

1

Buna bağımlılık sorunu neden olmalı, genel olarak bağımlılığı kontrol etmeniz gerekir.


1

Sorun bu sınıfta:

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

Başvurunuzu başlatmanın doğru yolu:

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

1

Açık depo olası bir çözümdür.

Windows -> maven deposundaki tüm alt klasörleri silin:

C: \ Users \ YourUserName.m2 \ deposu


Java Spring'deki PluralSight eğitimini takip eden herkes için, bu benim için çalışan tek çözüm!
Janac Meena

1

Ben de aynı sorunla karşılaştım. Maven kullanarak Main.class'ı ve Spring-Boot'daki aşağıdaki ek açıklamaları tanımlayamadığım için:

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

0

Sorun, başlangıç ​​tomcat'in hariç tutulması, onu hariç tutmaya ve vert.x'i kullanmayı denedim, bu yüzden Spring Admin ile entegre ettiğimde, sorunlar başladı

<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

Aşağıdaki durumda bu İstisna vardı.

benim POM özellikleri vardı:

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

ve uygulama sınıfımın adı ve yolu ("başlangıç ​​sınıfı") yanlıştı.


0

Benzer bir sorun vardı ve sorun bir kırık maven repo kavanoz dosyası oldu. Benim durumumda, tomcat-embed-corekavanoz dosyası kırıldı. Bu yüzden maven deposundan kaldırdım ve tekrar indirmek için yeniledim.


] Yanıtınızı düzgün bir şekilde düzenlemek ve biçimlendirmek için lütfen biçimlendirme araçlarını kullanın.
Morse

0

Benim durumumda, kaynak klasörü pomaşağıdaki kodu kullanarak hariç tuttuktan sonra olur .

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

Bu kodu yorumlamak kodumu başlattı.


0

Bu sorunun bir diğer nedeni, maven depo kavanozlarının bozulmasıdır, böylece sorunu çözmek için aşağıdaki komutu kullanabilirsiniz:

mvn dependency:purge-local-repository

0

Muhtemelen bahar önyükleme başlangıç ​​sınıfınızda @SpringBootApplication eksik .

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}

0

Gradle kullanıyorum, bir komutum olduğunda karşılaşılan bir sorun varLineRunner gelen kancaları almak için kafka konularını ve sağlık kontrol uç noktasını tüketiyor. Anlamak için 12 saat geçirdim, sonunda mybatis-spring-boot-starter'ı spring-boot-starter-web ile kullandığımı ve bazı çatışmaların olduğunu buldum. İkincisi, mybatis-spring-boot-starter yerine doğrudan mybatis-spring, mybatis ve spring-jdbc'yi tanıttım ve program iyi çalıştı.

Bu yardımcı olur umarım

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.