当前位置: 首页 > news >正文

基于 Maven 的多模块项目架构

1. 关键 Maven 组件含义

在多模块项目中,以下四个标签构成了骨架的核心:

1.1<modules>

  • 含义:聚合(Aggregation)。用于在父(根)项目中声明包含的子模块。
  • 作用:告诉 Maven:“当构建我(根项目)时,请顺带构建以下这些子文件夹”。它决定了 Maven 反应堆(Reactor)的扫描范围。
  • 代码示例(根 POM):
<modules><module>dependencies</module><module>server</module><module>hmdianping</module></modules>

1.2<dependencyManagement>

  • 含义:依赖版本锁定。
  • 作用:它只声明依赖的groupIdartifactIdversion不下载 Jar 包。它的作用是建立一个“版本字典”,供子模块查询。
  • 代码示例(Dependencies 模块):
<dependencyManagement><dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.26</version></dependency></dependencies></dependencyManagement>

1.3<dependencies>

  • 含义:依赖引入。
  • 作用:真正的“下单”操作。Maven 会根据这里列出的坐标下载 Jar 包并加入 Classpath。如果在子模块中使用,且父工程/BOM 中已声明版本,则此处不写版本号
  • 代码示例(业务模块 POM):
<dependencies><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId></dependency></dependencies>

1.4<packaging>pom</packaging>

  • 含义:打包类型为 POM。
  • 作用:声明该项目是一个“容器”或“配置清单”,不包含 Java 代码,也不会生成 JAR 文件。
  • 适用场景:根项目(Root)、版本管理模块(BOM/Dependencies)。

2. 多模块项目介绍与各模块 POM 职责

标准架构通常分为三层:根项目->BOM 模块->业务/启动模块

2.1 根项目 (Root)

  • 职责:全局总控。定义全局变量、聚合子模块、配置编译插件。
  • POM 内容
<groupId>cn.iocoder.boot</groupId><artifactId>SpringDataRedis</artifactId><version>${revision}</version><packaging>pom</packaging><modules><module>dependencies</module><module>hmdianping</module></modules><properties><revision>2026.2.4-jdk17-SNAPSHOT</revision></properties><dependencyManagement><dependency><groupId>cn.iocoder.boot</groupId><artifactId>dependencies</artifactId><version>${revision}</version><type>pom</type><scope>import</scope><relativePath>dependencies/pom.xml</relativePath></dependency></dependencyManagement>

2.2 依赖管理模块 (Dependencies)

  • 职责:版本大管家。纯配置文件,不写代码。
  • POM 内容
<parent><artifactId>SpringDataRedis</artifactId><groupId>cn.iocoder.boot</groupId><version>${revision}</version><relativePath>../pom.xml</relativePath></parent><artifactId>dependencies</artifactId><packaging>pom</packaging><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>3.5.10</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>cn.iocoder.boot</groupId><artifactId>hmdianping</artifactId><version>${revision}</version></dependency></dependencies></dependencyManagement>

2.3 业务模块 (hmdianping)

  • 职责:代码实现。
  • POM 内容:使用<dependencies>引入所需 Jar 包(如 MyBatis-Plus),不写版本号。

2.4 启动模块 (Server)

  • 职责:程序入口。
  • POM 内容
  • 引用所有业务模块(如hmdianping)。
  • 配置spring-boot-maven-plugin插件进行打包(Repackage)。

3. POM 文件是如何串联起来的

这几个文件通过继承聚合导入三种机制形成闭环:

  1. 向下聚合:根 POM 通过<modules>找到dependencieshmdianping,建立构建列表。
  2. 向上继承:子模块通过<parent>+<relativePath>继承根 POM,从而获取${revision}变量和插件配置。
  3. 横向导入
  • 根 POM 在dependencyManagementimportdependencies模块。
  • 业务模块在引用依赖时,Maven 会向上追溯到根 POM,根 POM 指向dependencies模块,从而解析出正确的版本号。

串联示意图:

Root POM (定义变量) <–(继承)-- Children (获取变量)
Root POM (引用 BOM) --(Import)–> Dependencies POM (提供版本)
Business POM (请求依赖) --(查表)–> Root POM --> Dependencies POM


4. 多模块构建流程 (mvn install)

当在根目录执行mvn clean install时:

  1. 解析阶段:Maven 读取根 POM,解析${revision}2026.2.4-jdk17-SNAPSHOT
  2. 计算反应堆 (Reactor):Maven 扫描<modules>,分析依赖拓扑,计算出构建顺序:
  • Root->dependencies->hmdianping->server
  1. 执行阶段
  • Root:安装根 POM 到本地仓库。
  • Dependencies:读取 pom.xml,将其安装到本地仓库(作为版本参考文件)。
  • Hmdianping:编译 Java 代码,利用dependencies提供的版本号下载 Jar 包,最终打成hmdianping.jar安装到仓库。
  • Server:编译启动类,将hmdianping.jar和其他三方包解压合并,打成可运行的 Fat-Jar。

5. 为什么继承 spring-boot-starter-parent 会报错

在自定义的多模块架构中,如果根 POM 写了<parent>继承spring-boot-starter-parent,常报Non-resolvable import POMCould not find artifact

原因分析:

  1. 继承链冲突:Maven 只能单继承。如果你继承了 Spring Boot,就无法形成“根项目作为所有子模块唯一父类”的闭环。
  2. 依赖查找死锁
  • 根 POM 继承 Spring Boot 后,Maven 会优先按照 Spring Boot 的规则初始化。
  • 此时根 POM 试图import本地的dependencies模块。
  • 由于 Maven 认为父类是远程的 Spring Boot,它会倾向于去远程/本地仓库查找dependencies模块,而忽略本地磁盘(Local Disk)。
  • 结果:因为dependencies是你刚写的,仓库里没有,Maven 报错“找不到构件”。

解决方案:

  • 解耦:根 POM不要继承spring-boot-starter-parent
  • 组合:在dependencies模块中通过import方式引入spring-boot-dependencies
  • 本地路径:在根 POM 引用dependencies时,必须强制指定<relativePath>dependencies/pom.xml</relativePath>,告诉 Maven:“别去仓库找了,文件就在磁盘这个位置”。
http://www.jsqmd.com/news/343737/

相关文章:

  • 2026年初,滁州企业如何选择高水准的VI设计服务? - 2026年企业推荐榜
  • MySQL-索引
  • 初识C++:类和对象 内存管理
  • PyCharm环境配置全攻略:调试TranslateGemma模型的Python开发环境搭建
  • 成为 aoliao 粉丝的第一天
  • translategemma-4b-it新手教程:不写代码也能用浏览器完成图文翻译任务
  • 深度学习环境配置:Ubuntu系统优化与常用命令大全
  • 世毫九实验室三大核心理论综合研究报告
  • Qwen3-ASR-0.6B语音识别:多语言支持实测分享
  • 如何将电池材料研磨至纳米级,具体方法、注意事项?
  • 灵感画廊开发者案例:基于SDXL 1.0构建跨平台(Web/iOS/Android)艺术APP
  • SiameseUIE中文-base部署避坑指南:常见连接失败与空结果解决方案
  • 使用Cursor开发EasyAnimateV5-7b-zh-InP模型插件
  • java二叉树的简单创建和遍历
  • 24G显存也能玩!BEYOND REALITY Z-Image高效部署方案
  • 2026宿州职业装定制企业评测:谁在引领娱乐行业新风尚? - 2026年企业推荐榜
  • Phi-4-mini-reasoning实测:128K长文本推理能力惊艳展示
  • 2026年音乐留学中介选择:如何识别并选择真正的4E教学体系机构? - 2026年企业推荐榜
  • 本杰明·格雷厄姆的资产负债表分析方法
  • 看不懂 ComfyUI?把它当“生产线”来设计工作流(新手也能上手的版本)
  • 如何识别企业的边缘AI视频分析芯片优势
  • 大数据领域中 RabbitMQ 的安全配置要点
  • 世盟股份深交所上市:市值48亿 预计年营收9亿同比降10%
  • 德业股份冲刺港股:9个月营收88亿 利润23亿 张和君控制60%表决权
  • 基于阿里云v2018数据集的机器负载概率预测:外生特征工程与Python实现
  • eVTOL主机厂沃飞长空完成近10亿融资:光合创投联合投资
  • 摆脱局域网!GoLand+cpolar 解锁 Go 开发远程协作新玩法
  • 多语言 RAG、算法思维、异常值检测与其他问题解决亮点
  • 多层感知器,解释:带有迷你二维数据集的视觉指南
  • 【资讯】CMSIS-DSP库发布V1.7.0版本,ARM发消息Mbed平台将于2026年7月终止服务