Inicialização do Spring: Não foi possível iniciar o EmbeddedWebApplicationContext devido à falta do bean EmbeddedServletContainerFactory


173

Sou totalmente novo no Spring e comecei a fazer os guias oficiais deste site: https://spring.io/guides

Gostaria de fazer este guia: https://spring.io/guides/gs/scheduling-tasks/

Eu recebo a seguinte exceção:

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

A classe inicial de aplicativos é a seguinte:

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

Como você pode ver, o método principal contém uma linha comentada. Eu já fiz um tutorial, ou seja, este: https://spring.io/guides/gs/consuming-rest/ Está funcionando. Mas não consigo executar o aplicativo ScheduledTasks, que é o seguinte:

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

Eu uso o Eclipse e executo o principal do Application.java como um aplicativo. Alguém poderia me ajudar, por favor?

Respostas:


66

O guia de agendamento não é um aplicativo da web; portanto, você provavelmente tem algumas coisas bolorentas no pom.xml do guia REST? Se você seguir as instruções atentamente, deve funcionar. Outro problema em potencial com o código que você postou acima é que sua @EnableAutoConfigurationclasse não é usada no contexto, apenas como método principal (o que pode não ser um problema para o guia de agendamento, mas provavelmente para muitos outros).


1
Estou fazendo todos os tutoriais em um projeto Eclipse, terminando com um pom gigante. Coloquei-o em um projeto separado usando o pom do tutorial e agora funciona perfeitamente. Obrigado pela ajuda! E se eu quiser um agendador em um aplicativo da Web Spring usando essa API? Eu não posso fazer isso?
Kumite

De fonte você pode fazer isso. Mas você precisaria de todas as dependências para um webapp.
Dave Syer 17/02

1
Mas então acabo tendo a exceção que você pode ver na abertura do thread. Desculpe, acho que estou perdendo alguma coisa. Devo postar o pom.xml "ruim" aqui?
Kumite

1
Um pom "bom" teria "spring-boot-starter-web" (por conveniência) ou então todas as dependências incluídas no starter listadas individualmente. Apenas verifique se você os possui. Além disso, inclua um @EnableAutoConfigurationno seu SpringApplication(o snippet de código acima não).
21814 Dave Syer

6
Funciona perfeitamente, não posso agradecer o suficiente. E para obtê-lo trabalhar eu tinha que adicionar as classes para ser executado em uma matriz de objectos para o método run de SpringApplication:SpringApplication.run(new Object[]{Application.class, ScheduledTasks.class}, args);
Kumite

48

Uma varredura do @SpringBootApplicationprograma que inclui as seguintes anotações:

@Configuration
@ComponentScan
@EnableAutoConfiguration

Então você também pode fazer isso:

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

29

use este no seu pom.xml:

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

ou este:

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

1
Adicionando 2 jar funcionou para mim também. Eu tive que usar os dois embora
Fafore Tunde

1
@FaforeTunde não é um bom sinal, dê uma olhada na sua árvore de dependência e verifique se você usou a tag <scope> nela.
Pasha GR

27

Eu tinha várias classes de aplicativos em um projeto do Spring Boot, que teve a Web iniciada incluída e queria evitar que ele configurasse um ambiente da Web para um deles, então eu o configurei manualmente como abaixo:

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

ATUALIZAÇÃO para Spring Boot 2 e superior:

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

23

Tente isto

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

20

O erro sugere que o aplicativo que você está tentando executar não pode instanciar uma instância do apache tomcat. Verifique se você está executando o aplicativo com tomcat.

se, depois de verificar todas as suas dependências, você enfrentar o mesmo problema, tente adicionar o seguinte na sua classe de configuração

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

Se você estiver usando uma instância externa do tomcat (especialmente para intellij), o problema pode ser que o IDE esteja tentando iniciar o tomcat incorporado. Nesse caso, remova o seguinte do pom.xml e configure o tomcat externo usando o assistente 'Editar configurações'.

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

2
Ótima resposta! Resolveu o meu problema. No entanto, estava trabalhando em intellij. Quando criei o jar usando o plug-in maven shade, o mesmo caminho de classe foi criado para que eu realmente não entenda o que aconteceu.
aprendiz

14

Adicionar

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

8

se você enfrentar essa exceção ao usar o intellij e estiver tentando iniciar o aplicativo com o runbotão Tente iniciar o aplicativo na linha de comando. Por exemplo, verifique se você está no diretório correto (diretório com seu arquivo pom) assumindo que este é um springbootaplicativo executadomvn spring-boot:run isso fez o truque para mim.

Além disso, também vi esse erro ocorrer quando seu aplicativo de primavera depende de outro aplicativo. Nesse caso, tive que iniciar o outro aplicativo primeiro e depois executar.


1
Reiniciando o IntelliJ (Ultimate 2.016,3 aqui) fixa-lo para mim
mangusbrother

Além da solução dada pelo Marquês acima, certifiquei-me de escolher a versão correta da combinação mvn e jdk para executar o mvn spring-boot:run
comando

6

Adicionando a anotação @SpringBootApplicationAntes que a classe inicial corrigisse esse problema para mim (em essência, essa mensagem de erro pode significar "você não tem uma @SpringBootApplicationclasse marcada em nenhum lugar, precisa de pelo menos uma)

@SpringBootApplication
public class AppStarter {

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

4

Eu tive problemas semelhantes quando o método principal está em uma classe diferente daquela que foi passada para SpringApplcation.run ()

Portanto, a solução seria usar a linha que você comentou:

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

3

Se você empacotá-lo como um jar único e ele não for um aplicativo da Web, tente carregar o contexto do aplicativo como abaixo.

@SpringBootApplication

ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);

Ou use o plugin abaixo para empacotar como um único jar

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

você pode especificar as configurações externas usando o comando abaixo para executar

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

Observe que se você estiver passando as propriedades como argumentos, não as inclua @PropertySource("classpath:test.properties"), substituirá os parâmetros


Adicionar o spring-boot-maven-plugin e o <phase> package </phase> e depois executar o aplicativo como mvn clean package funcionou para mim.
Hipokito 28/07/19

2

Se você executá-lo com êxito usando a linha de comando gradle bootRun, enquanto o empacota com a linha de comando gradle jarno arquivo jar para executá-lo com a linha de comando java -jar build/libs/demo.jar, infelizmente, falhou com a Exceção: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory beannesse caso, você precisa usar a tarefabootRepackage do plugin gradle spring-bootpara gerar informações especiais. frasco executável.

  • configuração 1

    $ gradle clean bootRepackage

  • configuração 2

    $ java -jar compilação / libs / demo.jar


Não faço ideia do porquê, mas gradle clean bootRepackage me ajudou. Anteriormente, eu limpei manualmente todo o cache e crie a pasta.
Andrii Abramov

2

A SpringApplicationtentará criar o tipo certo ApplicationContextem seu nome. Por padrão, um AnnotationConfigApplicationContextouAnnotationConfigEmbeddedWebApplicationContext será usado, dependendo de você estar desenvolvendo um aplicativo Web ou não.

O algoritmo usado para determinar um 'ambiente da web' é bastante simplista (com base na presença de algumas classes). Você pode usarsetWebEnvironment(boolean webEnvironment) se precisar substituir o padrão.

Também é possível assumir o controle completo do ApplicationContexttipo que será usado chamandosetApplicationContextClass(…​) .

[Dica] Geralmente, é desejável chamar setWebEnvironment(false)ao usar SpringApplicationdentro de um teste JUnit.


Como você usa setWebEnvironment ao criar o aplicativo via SpringApplication.run(Application.class, args);?
tgdavies

@tgdavies veja minha resposta acima, você pode usar oSpringApplicationBuilder
Robert Hunt

2

A adição da dependência do iniciador de inicialização por mola corrigiu meu erro.

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

Isso é necessário se você deseja iniciar o tomcat como um servidor incorporado.


2

verifique se o seu pom.xml existe

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

Eu tive um problema como este ; Por falta dessa dependência


Isso resolve meu problema.
lenhhoxung

1

No meu caso, adicionamos a anotação @Profile recentemente para ignorar a classe TestApplication no modo de produção e a classe Application no modo de teste.

Infelizmente, esquecemos de adicionar a seguinte linha nos arquivos application.properties:

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

Sem essas configurações, nenhum perfil foi carregado, o que causou o erro de primavera "não tanto".


Gostaria de acrescentar que você também pode obter esse erro se fornecer a anotação @Profile e passar o perfil para a jvm.
magro

1

Isso deve ser causado por um problema de dependência; em geral, você precisa verificar a dependência.


1

O problema está nesta classe:

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

A maneira correta de iniciar seu aplicativo é:

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

1

Limpar o repositório é uma solução possível.

Windows -> exclua todas as subpastas no repositório maven:

C: \ Users \ YourUserName.m2 \ repository


Para quem segue o tutorial do PluralSight no Java Spring, esta é a única solução que funcionou para mim!
Janac Meena

1

Eu fiquei com o mesmo problema. Como não defini Main.class e as seguintes anotações no Spring-Boot usando o Maven:

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

0

O problema é a exclusão do tomcat inicial, tentei excluí-lo e usar o vert.x, portanto, quando integro o wit Spring Admin, iniciamos os problemas

<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

Eu tive essa exceção na seguinte situação.

no meu POM havia propriedades:

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

e o nome e o caminho da minha classe de aplicativo ("start-class") estavam incorretos.


0

Eu tive um problema semelhante e o problema era um arquivo de jar de repositório de maven quebrado. No meu caso, o tomcat-embed-corearquivo jar foi quebrado. Então, removi-o do repositório maven e atualizei-o para fazer o download novamente.


] Use as ferramentas de formatação para editar e formatar corretamente sua resposta.
Morse

0

No meu caso, isso acontece depois de excluir a pasta do pomrecurso do código a seguir.

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

Comentar esse código iniciou meu código.


0

Uma outra causa desse problema é a corrupção dos jars do repositório maven, para que você possa usar o seguinte comando para resolver o problema:

mvn dependency:purge-local-repository

0

Provavelmente você está sentindo falta de @SpringBootApplication na sua classe de inicialização de primavera.

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}

0

Estou usando gradle, conheci o problema quando tenho um commandLineRunner que consome tópicos kafka e um ponto de extremidade de verificação de integridade para receber ganchos de entrada. Passei 12 horas para descobrir, finalmente descobri que usei mybatis-spring-boot-starter com spring-boot-starter-web, e eles têm alguns conflitos. Posteriormente, introduzi diretamente mybatis-spring, mybatis e spring-jdbc, em vez do mybatis-spring-boot-starter, e o programa funcionou bem.

espero que isto ajude

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.