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.