ApplicationContextException: невозможно запустить ServletWebServerApplicationContext из-за отсутствия bean-компонента ServletWebServerFactory

Я написал пакетное приложение Spring, использующее Spring boot. Когда я пытаюсь запустить это приложение с помощью командной строки и пути к классам в моей локальной системе, оно работает нормально. Однако, когда я попытался запустить его на сервере Linux, он дал мне следующее исключение

Unable to start web server; nested exception is
org.springframework.context.ApplicationContextException: 
Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.

Ниже показано, как я его использую:

java -cp jarFileName.jar; lib\* -Dlogging.level.org.springframework=DEBUG -Dspring.profiles.active=dev -Dspring.batch.job.names=abcBatchJob com.aa.bb.StartSpringBatch > somelogs.log
90
1
186 288
23
Перейти к ответу Данный вопрос помечен как решенный

Ответы 23

Дело 1:

В вашем стартовом классе весенней загрузки отсутствует аннотация @SpringBootApplication.

Случай 2:

Для не веб-приложения отключите web application type в файле свойств:

В application.properties:

spring.main.web-application-type=none

Если вы используете application.yml, добавьте:

  spring:
    main:
      web-application-type: none

Для веб-приложений расширяет *SpringBootServletInitializer* в основном классе.

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

Случай 3:

Если вы используете spring-boot-starter-webflux, добавьте также spring-boot-starter-web в качестве зависимости.

Спасибо за ответ, но мое приложение не является веб-приложением

Vijayant Bhatia 09.05.2018 12:16

@VijayantBhatia, ты понял это? Я запускаю не веб-приложение при весенней загрузке и получаю ту же ошибку.

anon58192932 04.06.2018 20:43

Заявление YourAppliationName.run (YourAppliationName.class, args); неверно, это должен быть SpringApplication.run (YourAppliationName.class, args);

JanPl 17.02.2019 21:45

А как насчет случая 4. Обычно он устанавливается на Tomcat, но пытается запустить его локально без использования сервера Tomcat? Я попробовал причал, но, похоже, это не помогло, и мне нужно было создать профили.

JGleason 12.05.2021 16:49
Ответ принят как подходящий

Решение:

Я явно установил для свойства ниже none в файле application.yml.

spring:
  main:
    web-application-type: none

Обновление spring-boot-starter-parent в pom.xml до последней версии устранило это для меня.

можешь поделиться тем, что добавила? какая версия?

shak 05.10.2018 18:08

Судя по тому времени, когда я это опубликовал, похоже, что это была версия 2.0.2.RELEASE. На следующий день вышла версия 2.0.3.

Michael 05.10.2018 22:54

У меня возникла эта проблема при переходе на Spring Boot. Я нашел совет по удалению зависимостей, и это помогло. Итак, я удалил зависимость для проекта jsp-api. Также необходимо удалить зависимость сервлет-api.

compileOnly group: 'javax.servlet.jsp', name: 'jsp-api', version: '2.2' 

У меня проблема с группой компиляции: 'javax.servlet', имя: 'javax.servlet-api', версия: '4.0.1'

mger1979 21.05.2019 22:54

Как и @ mger1979, моя проблема заключалась в использовании группы: 'javax.servlet', имя: 'javax.servlet-api', версия: '3.1.0' с весенней загрузкой: 2.1.8.RELEASE, поэтому я обновился до 'javax.servlet 'до версии' 4.0.1 ', и теперь все работает нормально, спасибо.

hermeslm 15.09.2019 23:39

Возможно, вам не хватает @SpringBootApplication в стартовом классе весенней загрузки.

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}

Я столкнулся с этой проблемой при попытке запустить мое веб-приложение как толстая банка, а не из моей IDE (IntelliJ).

Это то, что сработало для меня. Просто добавьте профиль по умолчанию в файл application.properties.

spring.profiles.active=default

Вам не нужно использовать значение по умолчанию, если вы уже настроили другие конкретные профили (dev / test / prod). Но если у вас этого нет, необходимо запустить приложение как толстую банку.

Аннотируйте класс public static void main с помощью, например: @SpringBootApplication

Вероятно, вы используете это в своем проекте:

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

в этом случае вам также нужно будет добавить:

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

и происходит волшебство :)

PS: это потому, что Spring по умолчанию будет использовать веб-MVC вместо веб-поток, когда оба доступны

В моем случае проблема заключалась в том, что у меня не было отдельно установленного сервера Tomcat в моем eclipse. Я предполагал, что мой Springboot автоматически запустит сервер внутри себя.

Поскольку мой основной класс расширяет SpringBootServletInitializer и переопределяет метод configure, мне определенно нужен сервер Tomcat, установленный в моей среде IDE.

Для установки сначала скачайте Apachce Tomcat (в моем случае версия 9) и создайте сервер, используя вкладку «Серверы».

После установки запустите основной класс на сервере.

Run As -> Run on Server

Мое решение связано с плохой зависимостью. Я имел:

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

В моем pom и мне пришлось закомментировать исключение, чтобы оно работало. По какой-то причине он должен искать этот пакет tomcat.

Именно в этом и заключается проблема в большинстве случаев. Tomcat исключен, поэтому приложение может работать на внешних серверах, и если приложение не расширяет SpringBootServletInitializer, это произойдет.

Ashish 12.04.2021 09:43

Что касается меня, я удалил область provided в зависимости от tomcat.

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

Я пытался создать веб-приложение с весенней загрузкой и получил ту же ошибку. После проверки я обнаружил, что мне не хватает зависимости. Итак, не забудьте добавить следующую зависимость к вашему файлу pom.xml.

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

В моем случае проблема решена при комментировании исключения зависимостей tomcat из spring-boot-starte-web

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

В моем случае я использовал TOMCAT 8, и обновление до TOMCAT 9 исправило его:

  <modelVersion>4.0.0</modelVersion>
  <groupId>spring-boot-app</groupId>
  <artifactId>spring-boot-app</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.1.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>com.h2database</groupId>
      <artifactId>h2</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
          <execution>
            <goals>
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>com.example.Application</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <properties>
    <tomcat.version>9.0.37</tomcat.version>
  </properties>

Связанные вопросы:

  1. https://github.com/spring-projects/spring-boot/issues?q=missing+ServletWebServerFactory+bean
  2. https://github.com/spring-projects/spring-boot/issues/22013 - приложение Spring Boot как модуль
  3. https://github.com/spring-projects/spring-boot/issues/19141 - приложение не загружается, когда основной класс расширяет базовый класс, аннотированный с помощью @SpringBootApplication, когда spring-boot-starter-web включен в качестве зависимости

Помимо возможных решений в других ответах, также возможно, что на вашем компьютере каким-то образом произошло повреждение зависимости Maven. Я столкнулся с той же ошибкой при попытке запустить мое (веб) приложение загрузки Spring, и она была решена путем выполнения следующего:

mvn dependency:purge-local-repository -DreResolve=true

с последующим

mvn package

Я пришел к этому решению, изучая другую проблему, когда Eclipse не позволял мне запускать основной класс приложения из IDE из-за другой ошибки, аналогичной ошибке в этом потоке SO -> Тип org.springframework.context.ConfigurableApplicationContext не может быть разрешен. На него косвенно ссылаются из необходимых файлов .class

Добавление следующего bean-компонента сработало для меня.

    @Bean
    public ServletWebServerFactory servletWebServerFactory() {
        return new TomcatServletWebServerFactory();
    }

Я запускал приложение, отличное от веб-весны, с использованием SpringApplication.run(MyApplication.class, args); без аннотации @SpringBootApplication.

  1. @SpringBootApplication: проверил, не сработало.
  2. spring-boot-starter-web в файле Pom: проверено, не сработало.
  3. Переключитесь с IntelliJ CE на IntelliJ Ultimate, проблема решена.

Подобно решению убедиться, что org.springframework.boot:spring-boot-starter-tomcat установлен, мне не хватало org.eclipse.jetty:jetty-server в моем build.gradle.

org.springframework.boot:spring-boot-starter-web нужен сервер, будь то Tomcat, Jetty или что-то еще - он скомпилируется, но не запустится без него.

Я щелкнул правой кнопкой мыши свой проект в IntelliJ IDEA, затем Maven -> Reload project, проблема решена.

Это не дает ответа на вопрос. Как только у вас будет достаточно репутация, вы сможете комментировать любой пост; вместо этого дать ответы, не требующие пояснений от спрашивающего. - Из обзора

Alex Rudenko 12.10.2020 01:04

@Bhanu Это исправило мою ошибку! Спасибо

Rishabh Agarwal 19.02.2021 21:17

Если вы используете IntelliJ, и это происходит с вами (как это было с моим noob-self), убедитесь, что в параметре Run указано Spring Boot Application, а НЕ обычное приложение.

Моя проблема была такой же, как и в исходном вопросе, только я работал через Eclipse, а не cmd. Пробовал все перечисленные решения, но не сработало. Однако окончательное рабочее решение для меня было при запуске через cmd (или его можно запустить аналогичным образом через Eclipse). Используется измененная команда с добавлением конфигурации spring из cmd:

start java -Xms512m -Xmx1024m <and the usual parameters as needed, like PrintGC etc> -Dspring.config.location=<propertiesfiles> -jar <jar>

Я предполагаю, что моя проблема заключалась в том, что конфигурации пружин загружаются неправильно.

Я хотел запустить приложение весенней загрузки типа WAR, и когда я пытался запустить приложение в качестве приложения весенней загрузки, я получал ошибку выше. Итак, объявление типа веб-приложения в application.properties сработало для меня. spring.main.web-application-type = none

Возможный тип веб-приложения:

  1. НИКТО - приложение не должно запускаться как веб-приложение и не должно запускать встроенный веб-сервер.
  2. РЕАКТИВНЫЙ - приложение должно работать как реактивное веб-приложение и должно запускать встроенный реактивный веб-сервер.
  3. СЕРВЛЕТ - приложение должно работать как веб-приложение на основе сервлета и должно запускать встроенный веб-сервер сервлета.

Я получал ту же ошибку при использовании более новой версии tomcat-jasper

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jasper</artifactId>
    <version>10.0.6</version>
</dependency>

Я заменил стабильную старую версию, у меня все работало нормально.

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jasper</artifactId>
    <version>9.0.46</version>
</dependency>

Другие вопросы по теме