Spring Boot多模块工程核心是父工程统筹管理、子模块职责分层、依赖单向明确;父工程packaging为pom、无src、用<modules>声明子模块并以<dependencyManagement>统一版本;典型结构含common(工具/异常)、pojo(数据对象)、dao(数据库交互)、service(业务逻辑)、web(Controller与启动类),其中仅web可打包运行。

Spring Boot 多模块工程不是把项目“拆着玩”,而是为了理清职责、复用代码、加快编译、方便协作。核心就三点:一个父工程管全局,多个子模块各司其职,依赖关系单向明确。
父工程:只做统筹,不写业务
父工程本质是个“空壳聚合体”,不放 Java 代码,也不带 src 目录。关键配置集中在 pom.xml:
- packaging 必须设为 pom:告诉 Maven 这不是可运行模块,而是用来管理子模块的
- 用 <modules> 声明所有子模块路径,比如 <module>common</module>、<module>web</module>
- 通过 <dependencyManagement> 统一声明依赖版本(如 spring-boot-starter-web、lombok),子模块引用时无需写 version
- 继承 spring-boot-starter-parent,自动获得 Spring Boot 默认配置和插件支持
子模块划分:按职责分层,避免循环依赖
典型结构(可根据实际调整):
- common 模块:放工具类、全局异常、统一返回 Result、常量、通用注解——被所有模块依赖,自身不依赖别人
- pojo / domain 模块:只放 Entity、DTO、VO、BO 等数据对象,供 service 和 web 共享
- dao 模块:含 Mapper 接口、XML、Repository,依赖 common + pojo
- service 模块:实现业务逻辑、事务控制,依赖 dao + pojo + common
- web 模块:Controller、拦截器、启动类,只依赖 service + common ——这是唯一能打成可执行 jar 的模块
依赖配置:写对 parent 和 dependency 才不报错
每个子模块 pom.xml 必须正确声明父工程:
- 第一行写 <parent>,指定 groupId、artifactId、version,与父 pom 一致
- 子模块自己需要的依赖(如 mybatis-spring-boot-starter)写在 <dependencies> 下;若已在父工程 <dependencyManagement> 中定义,此处只需写 groupId 和 artifactId
- 严禁出现 A 依赖 B、B 又依赖 A 的循环引用,Maven 会直接构建失败
IDEA 中实操要点
- 新建项目选 Maven,不勾任何 Spring Boot Starter,建完立刻删掉父工程的 src 目录
- 右键父工程 → “New” → “Module”,而不是重新 New Project,确保子模块自动继承 parent
- 模块命名建议统一前缀,如 bm-common、bm-web,避免后期混淆
- 运行时只运行 web 模块的 SpringBootApplication 类;打包也只对 web 模块执行 mvn clean package


















