You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot多模块Maven项目启动报错及自动退出问题求解

问题根因分析

  1. 配置spring.main.web-application-type: none会强制标记应用为非Web类型,Spring Boot初始化完成后没有常驻Web容器进程,运行结束直接退出返回状态码0。
  2. spring-boot-starter-tomcat设置<scope>provided</scope>代表依赖由外部运行环境提供,本地IDE默认不会加载该范围的依赖,导致找不到Web容器实例。
  3. 启动类仅标注@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:45:09