Spring Boot多模块Maven项目启动报错及自动退出问题求解
问题根因分析
- 配置
spring.main.web-application-type: none会强制标记应用为非Web类型,Spring Boot初始化完成后没有常驻Web容器进程,运行结束直接退出返回状态码0。 spring-boot-starter-tomcat设置<scope>provided</scope>代表依赖由外部运行环境提供,本地IDE默认不会加载该范围的依赖,导致找不到Web容器实例。- 启动类仅标注
@SpringBootConfiguration,缺少自动装配和组件扫描注解,Web容器相关Bean不会被自动创建。
解决方案
第一步:修正启动类注解
将project-exposition模块的启动类注解替换为@SpringBootApplication,该注解默认整合了配置、自动装配、组件扫描能力,会自动触发Web相关逻辑初始化,示例如下:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ExpositionApplication { public static void main(String[] args) { SpringApplication.run(ExpositionApplication.class, args); } }
如果子模块的包路径和启动类包路径不统一,额外增加@ComponentScan(basePackages = "你的项目统一根包")指定扫描范围即可。
第二步:移除无效配置
删除application.yml中的spring.main.web-application-type: none配置,Spring Boot会自动根据依赖识别为SERVLET类型的Web应用,启动内置容器常驻运行。
第三步:适配Tomcat依赖和部署模式
如果最终要打WAR包部署到AWS的外置Tomcat,保留provided scope的同时,需要让启动类继承SpringBootServletInitializer适配外置容器:
import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class ExpositionApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(ExpositionApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(ExpositionApplication.class); } }
本地IDE启动时如果仍报容器缺失错误,可在启动配置中勾选「包括provided范围的依赖」,或者通过profile区分本地和生产环境的依赖配置:
<profiles> <profile> <id>local</id> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> </dependencies> </profile> <profile> <id>prod</id> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> </dependencies> </profile> </profiles>
打生产部署包时指定prod profile打包即可。
第四步:确认模块依赖
检查project-exposition模块的pom.xml是否正确引入了其他子模块和Web核心依赖:
<dependencies> <dependency> <groupId>根项目groupId</groupId> <artifactId>project-application</artifactId> <version>项目版本</version> </dependency> <dependency> <groupId>根项目groupId</groupId> <artifactId>project-domain</artifactId> <version>项目版本</version> </dependency> <dependency> <groupId>根项目groupId</groupId> <artifactId>project-infrastructure</artifactId> <version>项目版本</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
AWS部署适配建议
针对后端+Angular前端的部署需求,可选择两种成熟方案:
- 前后端分离部署:前端打包后静态资源上传到S3搭配CloudFront做CDN,后端打可执行JAR包部署到EC2/ECS,通过API Gateway做路由转发。
- 一体化部署:把Angular打包后的静态资源放到
project-exposition模块的src/main/resources/static目录,直接打单个WAR/可执行JAR包部署,无需单独配置静态资源服务。
内容的提问来源于stack exchange,提问作者HATIM SETTI
相关产品推荐
相关产品推荐

