Я написал пакетное приложение 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
В вашем стартовом классе весенней загрузки отсутствует аннотация @SpringBootApplication.
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);
}
}
Если вы используете spring-boot-starter-webflux, добавьте также spring-boot-starter-web в качестве зависимости.
Спасибо за ответ, но мое приложение не является веб-приложением
@VijayantBhatia, ты понял это? Я запускаю не веб-приложение при весенней загрузке и получаю ту же ошибку.
Заявление YourAppliationName.run (YourAppliationName.class, args); неверно, это должен быть SpringApplication.run (YourAppliationName.class, args);
А как насчет случая 4. Обычно он устанавливается на Tomcat, но пытается запустить его локально без использования сервера Tomcat? Я попробовал причал, но, похоже, это не помогло, и мне нужно было создать профили.
Решение:
Я явно установил для свойства ниже none в файле application.yml.
spring:
main:
web-application-type: none
Обновление spring-boot-starter-parent в pom.xml до последней версии устранило это для меня.
можешь поделиться тем, что добавила? какая версия?
Судя по тому времени, когда я это опубликовал, похоже, что это была версия 2.0.2.RELEASE. На следующий день вышла версия 2.0.3.
У меня возникла эта проблема при переходе на 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, моя проблема заключалась в использовании группы: 'javax.servlet', имя: 'javax.servlet-api', версия: '3.1.0' с весенней загрузкой: 2.1.8.RELEASE, поэтому я обновился до 'javax.servlet 'до версии' 4.0.1 ', и теперь все работает нормально, спасибо.
Возможно, вам не хватает @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, это произойдет.
Что касается меня, я удалил область 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>
Связанные вопросы:
Помимо возможных решений в других ответах, также возможно, что на вашем компьютере каким-то образом произошло повреждение зависимости 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.
Подобно решению убедиться, что 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, проблема решена.
Это не дает ответа на вопрос. Как только у вас будет достаточно репутация, вы сможете комментировать любой пост; вместо этого дать ответы, не требующие пояснений от спрашивающего. - Из обзора
@Bhanu Это исправило мою ошибку! Спасибо
Если вы используете 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
Возможный тип веб-приложения:
Я получал ту же ошибку при использовании более новой версии 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>
Возможный дубликат Spring Boot: невозможно запустить EmbeddedWebApplicationContext из-за отсутствия bean-компонента EmbeddedServletContainerFactory