Spring Boot Maven项目打jar包运行报错:缺少ServletWebServerFactory bean
问题核心原因
该错误本质是Spring Boot应用运行时找不到内置Servlet Web服务器(默认是Tomcat)的实现类。VS Code本地运行正常是因为IDE会自动加载开发环境依赖,打jar包时对应依赖未被打包进jar包导致缺失。
排查步骤
- 检查pom.xml打包类型:确认
<packaging>标签配置为jar,如果配置为war,要么改为jar,要么选择外置Tomcat部署war包,不要直接用java -jar运行war包。 - 检查web依赖配置:查看
spring-boot-starter-web依赖是否排除了内置Tomcat,且Tomcat依赖被标记为<scope>provided</scope>,provided范围的依赖不会被打进可执行jar包。 - 检查打包插件配置:确认已经配置了
spring-boot-maven-plugin且开启了repackage目标,否则打包生成的是普通jar包,不包含依赖和启动入口。 - 检查web环境配置:查看application配置文件中是否设置了
spring.main.web-application-type=none,或者启动类@SpringBootApplication注解设置了webEnvironment = WebEnvironment.NONE,该配置会禁用web服务器自动启动。 - 检查自动配置排除项:查看
@EnableAutoConfiguration或@SpringBootApplication注解是否排除了ServletWebServerFactoryAutoConfiguration类,这会导致Spring Boot不自动加载Web服务器工厂。
解决方法
方案1:修正依赖配置
如果是内置Tomcat被设置为provided导致缺失,直接移除spring-boot-starter-web的Tomcat排除规则,以及单独的provided范围Tomcat依赖即可:
错误配置示例:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 移除下面这段exclusion --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 移除下面这段provided范围的tomcat依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
如果需要同时支持打war包部署外置Tomcat和打可执行jar包,可以保留上述配置,在spring-boot-maven-plugin中添加配置把provided依赖打进jar包:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin>
方案2:修正web环境配置
如果是主动禁用了web环境,删除对应配置即可:
- 删掉application.properties/yml中的
spring.main.web-application-type=none配置,或者改为spring.main.web-application-type=servlet - 删掉启动类
@SpringBootApplication注解中的webEnvironment = WebEnvironment.NONE属性,或者改为webEnvironment = WebEnvironment.SERVLET - 删掉
@EnableAutoConfiguration或@SpringBootApplication注解中对ServletWebServerFactoryAutoConfiguration的排除规则
方案3:修正打包插件配置
确保pom中配置了正确的Spring Boot打包插件,示例如下(版本号要和你使用的Spring Boot版本一致):
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.6.13</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
验证
修改完成后执行mvn clean package重新打包,再执行java -jar 项目名.jar启动验证即可。
内容的提问来源于stack exchange,提问作者Codshark11
相关产品推荐
相关产品推荐

