ApplicationContextException: 由于缺少 ServletWebServerFactory bean,无法启动 ServletWebServerApplicationContext

我使用 Spring 引导编写了一个 Spring 批处理应用程序。当我尝试在本地系统上使用命令行和类路径运行该应用程序时,它运行良好。但是,当我试图在 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
313034 次浏览

案例1:

在您的 Spring 启动初学者类中缺少 @SpringBootApplication注释。

案例2:

对于非 web 应用程序,在属性文件中禁用 web application type

application.properties:

spring.main.web-application-type=none

如果使用 application.yml,则添加:

  spring:
main:
web-application-type: none

对于 Web 应用程序,在主类中扩展 *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作为依赖项。

解决办法是:

我在 application.yml文件中显式地将下面的属性设置为 none

spring:
main:
web-application-type: none

pom.xml中的 spring-boot-starter-parent升级到最新版本为我修复了它。

我在迁移到 Spring Boot 时遇到了这个问题。我找到了一个 移除依赖项的通知血型,很有帮助。因此,我删除了对 Jsp-api项目的依赖。此外,还必须删除 Servlet-api依赖性。

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

也许你在春季启动课上错过了 @SpringBootApplication

@SpringBootApplication
public class LoginSecurityAppApplication {


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


}

当我试图以 肥罐子而不是在 IDE (IntelliJ)中运行 Web 应用程序时,我遇到了这个问题。

这是什么工作对我来说。只需添加一个默认配置文件到 应用性能文件。

spring.profiles.active=default

如果已经设置了其他特定的配置文件(dev/test/prod) ,则不必使用 default。但是如果您没有这样做,那么将应用程序作为一个胖罐子运行是必要的。

用例如 @SpringBootApplication注释类 public static void main

你可能在你的项目中使用这个:

<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 将默认使用 Web-MVC而不是 网络通量

在我的例子中,问题是在 Eclipse 中没有单独安装 Tomcat 服务器。我假设我的 Springboot 会自动启动服务器。

因为我的主类扩展了 SpringBootServletInitializer并覆盖了 configure方法,所以我肯定需要在 IDE 中安装 Tomcat 服务器。

要安装,首先下载 Apache Tomcat (在我的示例中是版本9)并使用 Servers 选项卡创建服务器。

安装后,在服务器上运行主类。

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>

在我的诗里,我不得不评论出排除,以使它工作。出于某种原因,它必须寻找这个公猫软件包。

对于我来说,我删除了 tomcat 依赖项中的 provided作用域。

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

我试图用 Spring 启动创建一个 web 应用程序,结果也出现了同样的错误。 在检查之后,我发现我丢失了一个依赖项。因此,一定要向 pom.xml 文件添加以下依赖项。

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

在我的例子中,这个问题在注释 spring-boot-start-web 中的 tomcat 依赖关系排除时得到了解决

     <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 启动应用程序
  3. Https://github.com/spring-projects/spring-boot/issues/19141 -当 spring-boot-starter-web 作为一个依赖项包含时,当主类扩展一个注释了@SpringbootApplication 的基类时,应用程序加载失败

除了其他答案中可能的解决方案之外,还有可能是 Maven 依赖性损坏以某种方式发生在您的机器上。我在尝试运行我的(Web) 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();
}

我正在运行没有 @SpringBootApplication注释的 SpringApplication.run(MyApplication.class, args);非 web Spring 应用程序。

与确保安装了 org.springframework.boot:spring-boot-starter-tomcat的解决方案类似,我的 build.gradle缺少了 org.eclipse.jetty:jetty-server

org.springframework.boot:spring-boot-starter-web需要一个服务器,不管是 Tomcat、 Jetty 还是其他什么——它可以编译,但是没有服务器就不能运行。

我在 IntelliJ IDEA 中右键点击了我的项目,然后是 Maven-> Reload 项目,问题解决了。

如果您正在使用 IntelliJ,并且这种情况发生在您身上(就像它发生在我的菜鸟自己身上一样) ,那么请确保 Run 设置具有 Spring Boot Application 和 NOT 素应用程序。

我的问题与最初的问题相同,只是我是通过 Eclipse 而不是 cmd 运行的。尝试了所有列出的解决方案,但没有工作。然而,我的最终工作解决方案是通过 cmd 运行(或者可以通过 Eclipse 类似地运行)。使用从 cmd 中添加 Spring config 的修改后的命令:

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

我想我的问题是弹簧配置没有被正确加载。

我想要运行 WAR 类型的 Spring 启动应用程序,当我试图将该应用程序作为 Spring 启动应用程序运行时,出现了以上错误。因此,在 应用性能中声明 Web 应用程序类型对我来说很有效。 Web-application-type = none

可能的网上应用程式类型:

  1. NONE -应用程序不应该作为 Web 应用程序运行,也不应该启动嵌入式 Web 服务器。
  2. 应用程序应该作为一个反应式 web 应用程序运行,并且应该启动一个嵌入式反应式 web 服务器。
  3. SERVlet -应用程序应该作为一个基于 SERVLET 的 web 应用程序运行,并且应该启动一个嵌入式 SERVLET web 服务器。

我在使用 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>

缺少依赖关系可能是这个问题的原因

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

要将 Spring 引导 wen 应用程序转换为独立的:

  1. 配置 application.properties:
spring.main.web-application-type=none
  1. 或者使用 NONE Web 上下文更新应用程序上下文。
ApplicationContext ctx = new SpringApplicationBuilder(MigrationRunner.class)
.web(WebApplicationType.NONE).run(args);

使用应用程序上下文,您可以获得 bean:

MyBean = (MyBean) ctx.getBean (“ myBean”,MyBean.class) ; Call _ a _ method (. .) ;

在我的例子中,gretty 插件(3.0.6)仍然处于活动状态。格雷蒂以某种方式影响了嵌入的公猫依赖性。移除 Gretty 修复了错误