Spring Boot 2.5.4升级后Eclipse运行缺失ServletWebServerFactory报错
问题根因排查步骤
1. 检查web容器依赖状态
你项目引入了war插件,默认打war包时Spring Boot会将内置Tomcat的依赖scope标记为provided,仅适配外部容器部署场景,本地main方法启动需要内置Servlet容器依赖可用:
- 先在build.gradle中强制指定内置容器依赖不被排除:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' // 强制内置Tomcat可用于本地运行 runtimeOnly 'org.springframework.boot:spring-boot-starter-tomcat' }
- 检查Eclipse运行配置的参数:打开启动项的
Arguments标签,确认Program arguments和VM arguments中没有--spring.main.web-application-type=none这类关闭web容器的配置,有则删除。
2. 清理Eclipse缓存与项目配置
Gradle版本升级后很容易出现Eclipse本地缓存的项目配置不兼容问题,按以下操作重置:
- 关闭Eclipse,删除项目根目录下的
.settings文件夹、.project、.classpath文件 - 执行
./gradlew cleanEclipse eclipse重新生成Eclipse适配的项目配置 - 若使用Buildship插件管理Gradle项目,先确认Buildship版本支持Gradle 6.9.1,版本过低先升级插件,再右键项目 -> Gradle -> Refresh Gradle Project重新同步依赖
- 重启Eclipse后再次尝试启动应用
3. 检查gretty插件的影响
你配置了gretty插件指定使用jetty9作为servlet容器,Eclipse运行时可能读取了gretty配置却未加载jetty依赖:
- 先注释掉build.gradle中gretty插件的引入和相关配置,同步依赖后重启测试
- 若需要保留gretty,额外添加jetty的starter依赖到runtime范围:
dependencies { runtimeOnly 'org.springframework.boot:spring-boot-starter-jetty' }
4. 修正启动类配置错误
你的启动类存在两处可能影响上下文加载的问题:
- 继承
SpringBootServletInitializer的重写方法中,sources传入的是PyacademyApplication.class,和当前启动类PApplication不一致,属于明显笔误,修正为和当前类一致 - 本地main方法启动时可手动指定web应用类型,强制走Servlet容器逻辑:
public static void main(String[] args) { new SpringApplicationBuilder(PApplication.class) .web(WebApplicationType.SERVLET) .run(args); }
5. 对比运行环境差异
打开Eclipse启动配置的Environment标签,对比和命令行执行gradlew appengineRun时的环境变量、JDK版本是否一致,确认jasypt加密密钥、云服务相关配置没有缺失,部分依赖在缺少必要配置时会自动关闭web容器上下文。
内容的提问来源于stack exchange,提问作者Kris Swat
相关产品推荐
相关产品推荐

