Я написал пакетное приложение 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

Ответы (23)

Решение:

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

spring:
  main:
    web-application-type: none

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

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

spring.profiles.active=default

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

Класс аннотаций public static void main с, например: @ SpringBootApplication

Случай 1:

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

Случай 2:

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

В 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 в качестве зависимости.

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

start java -Xms512m -Xmx1024m  -Dspring.config.location= -jar 

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

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

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

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

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

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

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

@SpringBootApplication
public class LoginSecurityAppApplication {

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

}

Отсутствие зависимости может быть причиной этой проблемы


  org.springframework.boot
  spring-boot-starter-web

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


  org.springframework.boot
  spring-boot-starter-tomcat
  provided // remove this scope

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

    
        org.springframework.boot
        spring-boot-starter-web
     

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

     
        org.springframework.boot
        spring-boot-starter-web
        
     

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

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

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

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

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

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

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

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

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


  org.springframework.boot
  spring-boot-starter-web
  
    
      org.springframework.boot
      spring-boot-starter-tomcat
    
  

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

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


    org.apache.tomcat
    tomcat-jasper
    10.0.6

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


    org.apache.tomcat
    tomcat-jasper
    9.0.46

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

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

, за которым следует

mvn package

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

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

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

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

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

Run As -> Run on Server

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

  4.0.0
  spring-boot-app
  spring-boot-app
  0.0.1-SNAPSHOT
  war

  
    org.springframework.boot
    spring-boot-starter-parent
    2.3.1.RELEASE
     
  

  
    
      org.springframework.boot
      spring-boot-starter-web
    
    
      org.springframework.boot
      spring-boot-starter-data-jpa
    
    
      com.h2database
      h2
    
    
      org.springframework.boot
      spring-boot-starter-test
    
  

  
    
      
        org.codehaus.mojo
        exec-maven-plugin
        1.2.1
        
          
            
              java
            
          
        
        
          com.example.Application
        
      
    
  

  
    9.0.37
  

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

  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 включен как зависимость

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


    org.springframework.boot
    spring-boot-starter-webflux

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


    org.springframework.boot
    spring-boot-starter-web

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

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

2022 WebDevInsider