Spring Загрузка: невозможно запустить EmbeddedWebApplicationContext из-за отсутствия EmbeddedServletContainerFactory bean
Я совершенно новичок в 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/consuming-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 как приложение. Может ли кто-нибудь помочь мне?
Ответы
Ответ 1
Руководство по планированию не является веб-приложением, поэтому у вас, вероятно, есть некоторые заплесневелые вещи в вашем pom.xml из руководства REST? Если вы внимательно следуете инструкциям, это должно сработать. Еще одна потенциальная проблема с кодом, который вы указали выше, заключается в том, что ваш класс @EnableAutoConfiguration
не используется в контексте, только как основной метод (который может и не быть проблемой для руководства по планированию, но это, вероятно, для группы других).
Ответ 2
Сканирование @SpringBootApplication
показывает, что оно включает в себя следующие аннотации:
@Configuration
@ComponentScan
@EnableAutoConfiguration
Таким образом, вы могли бы сделать это тоже:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(ScheduledTasks.class, args);
}
}
Ответ 3
используйте это в своем 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>
Ответ 4
Попробуйте это
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(ScheduledTasks.class, args);
}
}
Ответ 5
Ошибка говорит о том, что приложение, которое вы пытаетесь запустить, не может создать экземпляр 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>
Ответ 6
У меня было несколько классов приложений в одном проекте Spring Boot, в котором была запущена сеть, и я хотел избежать настройки веб-среды для одного из них, поэтому я вручную настроил его, как показано ниже:
@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);
}
}
Ответ 7
добавлять
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Ответ 8
если вы испытываете это исключение при использовании intellij и пытаетесь запустить приложение с помощью кнопки run
. Вместо этого попробуйте запустить приложение из командной строки. Например. убедитесь, что вы находитесь в правильной директории (папке с вашим pom файлом), предполагая, что это springboot
application run mvn spring-boot:run
, это помогло мне.
Кроме того, я также видел, что эта ошибка возникает, когда ваше приложение spring зависит от другого приложения. В этом случае я должен был запустить другое приложение, а затем запустить.
Ответ 9
Добавление аннотации @SpringBootApplication
До того, как @SpringBootApplication
класс исправил эту проблему для меня (поэтому, по сути, это сообщение об ошибке может означать "у вас нет класса, помеченного @SpringBootApplication
, вам нужен хотя бы один)
@SpringBootApplication
public class AppStarter {
public static void main(String[] args) {
SpringApplication.run(AppStarter.class, args);
}
}
Ответ 10
У меня были подобные проблемы, когда основной метод относится к другому классу, чем тот, который передан SpringApplcation.run()
Таким образом, решение будет заключаться в использовании строки, которую вы закомментировали:
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Ответ 11
Если вы упакуете его как единую банку, а это не веб-приложение, попробуйте загрузить контекст приложения, как показано ниже.
@SpringBootApplication
ApplicationContext ctx = new AnnotationConfigApplicationContext(Main.class);
Или используйте ниже плагин для упаковки в виде одной банки
<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")
, он переопределит параметры
Ответ 12
Если вы запустили его с помощью командной строки gradle bootRun
, упаковали его с командной строкой gradle jar
в jar файл, чтобы запустить его с командной строкой java -jar build/libs/demo.jar
, к сожалению, с Exception: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean
в этом случае вам нужно использовать задачу bootRepackage
для gradle плагина spring-boot
для создания специальной runnable jar.
- настройка 1
$gradle clean bootRepackage
- настройка 2
$java -jar build/libs/demo.jar
Ответ 13
A SpringApplication
будет пытаться создать правильный тип ApplicationContext
от вашего имени. По умолчанию используется AnnotationConfigApplicationContext
или AnnotationConfigEmbeddedWebApplicationContext
, в зависимости от того, разрабатываете ли вы веб-приложение или нет.
Алгоритм, используемый для определения "веб-среды", довольно упрощен (основанный на наличии нескольких классов). Вы можете использовать setWebEnvironment(boolean webEnvironment)
, если вам нужно переопределить значение по умолчанию.
Также можно взять полный контроль над типом ApplicationContext
, который будет использоваться при вызове setApplicationContextClass(…)
.
[Подсказка]
Часто бывает полезно вызвать setWebEnvironment(false)
при использовании SpringApplication
в тесте JUnit.
Ответ 14
Добавление зависимостей стартера загрузки spring зафиксировало мою ошибку.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Это необходимо, если вы хотите запустить tomcat как встроенный сервер.
Ответ 15
Проверьте, существует ли ваш pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
У меня была такая проблема: из-за отсутствия этой зависимости
Ответ 16
В моем случае мы добавили новую аннотацию @Profile, чтобы игнорировать класс TestApplication в рабочем режиме и класс Application в тестовом режиме.
К сожалению, мы забыли добавить следующую строку в файлы application.properties:
spring.profiles.active=test
or
spring.profiles.active=production
Без этой конфигурации профиль не был загружен, что вызвало не столь значительную ошибку Spring.
Ответ 17
Это должно быть вызвано проблемой зависимости, в общем, вам нужно проверить зависимость.
Ответ 18
Проблема в этом классе:
@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);
}
}
Ответ 19
Clear repository - одно из возможных решений.
Windows → удалить все подпапки в репозитории maven:
C:\Users\YourUserName.m2\репозиторий
Ответ 20
Проблема заключается в исключении стартера tomcat, я попытался исключить его и использовать vert.x, поэтому, когда я интегрирую wit 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>
Ответ 21
У меня было это исключение в следующей ситуации.
в моем 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" ) были неправильными.
Ответ 22
Я застрял с той же проблемой. Как я не определил Main.class и следующие аннотации в Spring-Boot с использованием Maven:
@SpringBootApplication
public class Main {
public static void main(String args[]){
SpringApplication.run(Main.class, args);
}
}
Ответ 23
У меня была похожая проблема, и проблема была в испорченном файле JAV. В моем случае файл jar tomcat-embed-core
был поврежден. Поэтому я удалил его из репозитория Maven и обновил, чтобы загрузить снова.
Ответ 24
В моем случае это происходит после исключения папки ресурсов из pom
с помощью следующего кода.
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>*/*.properties</exclude>
</excludes>
</resource>
</resources>
Комментируя этот код начал мой код.
Ответ 25
Другая причина этой проблемы - повреждение файлов хранилища maven, поэтому вы можете использовать следующую команду для решения проблемы:
mvn dependency:purge-local-repository
Ответ 26
Возможно, вы пропустили @SpringBootApplication в своем классе начальной загрузки.
@SpringBootApplication открытый класс LoginSecurityAppApplication {
public static void main(String[] args) {
SpringApplication.run(LoginSecurityAppApplication.class, args);
}
}