Maven依赖传递与聚合工程

第一部分:Maven内容体系回顾

1.1 四大模块

⭐ 老师强调:Maven内容整体分四大块,需梳理通顺。

模块 内容
概念 Maven定义、依赖管理、项目构建、应用场景、为何使用、模型
初识 安装、目录、环境变量、手动建项目、项目间关系与打包、仓库配置、IDEA整合
进阶 pom.xml文件、坐标、依赖传递、依赖阻断、仓库、生命周期、插件、继承与聚合
私服 搭建、发布项目供同事使用

⭐ 老师强调 :pom.xml就是Maven模型的具体载体,像蓝图落为图纸,厘清它才能懂依赖传递。

第二部分:依赖传递机制

2.1 依赖传递回顾

⭐ 老师强调 :如make-find依赖hello-find,后者依赖hello,则前者间接依赖hello。

复制代码
makeFind → HelloFriend → Hello
(第一直接依赖)  (第二直接依赖)

2.2 依赖阻断的两种方式

方式 说明 特点
可选依赖(optional) 主动声明某依赖不传递 稳定,不触发重新依赖
排除依赖(exclusion) 在引入时主动掐断传递链 精细控制

方式一:可选依赖(optional)

在hello-find依赖hello处加<optional>true</optional>标签:

复制代码
<dependency>
    <groupId>cn.ts.maven</groupId>
    <artifactId>Hello</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <optional>true</optional>
</dependency>

⭐ 老师强调:这种方式是"暴力"阻断------只要有一个后续依赖方需要a,a就被彻底阻断,所有依赖B的模块都拿不到a。

方式二:排除依赖(exclusion)

复制代码
<dependency>
    <groupId>cn.ts.maven</groupId>
    <artifactId>HelloFriend</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <groupId>cn.ts.maven</groupId>
            <artifactId>Hello</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2.3 实操演示要点

⭐ 老师强调:

  • 直接注释依赖若操作不当,刷新后依赖会重新出现,并非永久摘除
  • 用optional属性才是稳定"摘掉"且不触发重新依赖的办法
  • 改动在最后一层项目时,需以true阻断方式install打包到本地库,状态才会更新

本地库打包状态决定依赖可见性:

  • install是刷新状态的关键
  • clear和重打包解决缓存未同步

2.4 Maven刷新方式

刷新方式 说明
reload(完整重载) 抛弃缓存做全量更新
异步刷新(增量同步) 只智能识别改动部分

⭐ 老师强调 :若pom文件未变,用完整重载可能同步不了依赖;而改为true后,异步刷新能识别并同步,普通reload因pom无变化反而同步不到。这是全量清空缓存与增量按需更新的差异。

第三部分:Maven继承

3.1 继承的概念

⭐ 老师强调 :Maven继承和Java子类继承父类类似------父类属性方法子类可用,Maven里把公共配置放父模块 ,子模块继承即获得,目的是避免重复配置。

3.2 继承的意义

⭐ 老师强调 :继承的意义是让项目更安全。多模块独立开发时常依赖相同公共模块,把公共的插件、仓库地址、发布目录等写进父模块,子模块继承后配置一致,不用每处重写。

可继承的POM元素:

  • groupId、version
  • description、organization
  • properties
  • dependencies、dependencyManagement
  • repositories
  • build、reporting

⭐ 老师强调 :难点在于理解"避免重复"不仅是少写代码,更是统一配置防出错 。易混淆点是把Maven继承当单纯代码复用,其实它管的是构建配置而非业务代码。

第四部分:dependencyManagement vs dependencies

4.1 两种依赖管理方式

方式 说明 子模块行为
dependencies 父工程直接声明依赖 子模块全部强制继承
dependencyManagement 只做版本管理,不直接引入 子模块按需引用,无需写版本号

⭐ 老师强调 :父工程直接在dependencies里写依赖,子工程会全部继承 。比如父工程依赖了junit 4.9,刷新后每个子模块都带上这依赖。但这不合理:像专门做图片存储的模块根本不写代码,打包时却把依赖打四份,徒增负担。

正确做法 :用dependencyManagement

复制代码
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<properties>
    <junit.version>4.9</junit.version>
</properties>

⭐ 老师强调 :父工程只做统一依赖管理 ,子模块负责具体引用与应用 。像Spring Boot项目,它替我们省事是因为父工程(甚至多层父工程)已打包管理了大量依赖版本,并非没做而是封装好了。

第五部分:聚合工程

5.1 聚合 vs 继承

概念 说明
继承 子模块复用父配置(子认父)
聚合 父统管构建动作(父管子)

⭐ 老师强调 :聚合工程指父工程无代码,仅管理子模块;只需对父工程执行命令,其下所有子模块都会自动执行一遍。两者常并存但概念不同。

5.2 项目架构示例(哈米音乐)

⭐ 老师强调 :系统从单数据源走向多数据源时,公共的数据操作抽成独立模块,无页面、只操作数据,做成Maven Java项目打jar包 ;前台、后台有页面,是Maven Java Web项目打war包。

模块划分:

模块 角色 打包方式
父工程 只做依赖管理 pom
公共模块 数据操作,无页面 jar
前台(portal) 用户端,有页面 war
后台 管理端,有页面 war
图片服务器 存储图片,需部署 war

⭐ 老师强调 :各模块关系上,前台后台都依赖那个jar包模块取图片路径和照片,图片服务器也依赖它存数据,这整体就是聚合工程。

5.3 父工程创建步骤

⭐ 老师强调 :父工程只做依赖管理,不写代码,打包方式必须用pom而非jar。

  1. 先建普通Maven Java项目

  2. 删掉无用的src目录,留pom.xml

  3. 把<packaging>改成pom

    pom

    common
    portal
    manage
    file

⭐ 老师强调 :很多人默认打jar包,但父工程不编译代码,jar没意义。父工程统管依赖,子模块承载具体逻辑,这种结构避免重复引包。

5.4 子模块创建

⭐ 老师强调 :子模块不用写版本号,它跟随父工程变化,只需命名模块名。

子模块pom:

复制代码
<parent>
    <groupId>cn.ts.maven</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>
<artifactId>c211013</artifactId>

⭐ 老师强调:

  • 子模块靠parent体现继承
  • 父工程pom的modules标签体现聚合
  • 类似Spring Boot项目手写parent依赖公共父工程
  • 创建后选enable Auto import自动导入依赖

Web模块创建:

⭐ 老师强调:用Maven创建外部web app项目,选带Maven的web app模板。要点:

  • ArtifactId填console
  • 打包方式用war包
  • name、url可删
  • dependencies保留
  • build节点要去掉
  • 多余内容该去就去、该换行换行

5.5 后台模块结构

⭐ 老师强调 :后台模块须补齐java和resources两个目录,要用make dir把后者标记为源代码与资源文件夹,结构才正确。

复制代码
模块/
├── src/
│   ├── main/
│   │   ├── java/          ← 写代码
│   │   └── resources/     ← 资源文件(需标记)
│   └── test/
└── pom.xml

⭐ 老师强调:易错点是漏建或忘标记resources目录,会导致项目结构不对。

5.6 打包方式总结

打包方式 适用项目
jar 普通Maven Java项目、Spring Boot项目、公共数据模块
war Maven Java Web项目、前台、后台、图片服务器
pom 聚合工程(父工程)

⭐ 老师强调:区分打包类型与工程角色------无页面的数据模块打jar,有页面或需部署的打war;父工程仅管依赖打pom。

第六部分:前后端 vs 前后台

6.1 概念区分

⭐ 老师强调 :这两组是易混淆概念,需分清。

概念 划分依据 说明
前端/后端 技术职责 前端=页面呈现,后端=逻辑代码、操作数据库
前台/后台 使用角色与功能 前台=用户使用的端,后台=管理系统

⭐ 老师强调:

  • 前端指用户看到的页面,如访问淘宝、京东所见的整个系统界面
  • 后端是联系数据库的部分
  • 前台是面向消费者或商家的展示端,属于用户所见的系统
  • 后台则是管理页面

以哈米音乐为例:

  • 前台:用户听歌页面
  • 后台:管理音乐、歌手上架的系统
  • 两者操作的数据都存于数据库

⭐ 老师强调 :前台后台像商店门面和库房办公室,前端后端像装修陈列和内部记账发货,各有分工又相互支撑。

第七部分:聚合工程实操

7.1 聚合构建演示

⭐ 老师强调 :聚合工程只需对父工程执行命令,如打包或测试,其下所有子模块都会自动执行一遍 ,日志显示各模块跑完出现build success,各自生成对应包。

复制代码
父工程执行 mvn install
    │
    ├── common 模块 install → 生成jar
    ├── portal 模块 install → 生成war
    ├── manage 模块 install → 生成war
    └── file 模块 install → 生成war

⭐ 老师强调 :聚合让多模块构建统一化 ,不必逐个项目操作。易混淆点是继承与聚合常并存但概念不同------继承是子模块复用父配置,聚合是父统管构建动作。

相关推荐
ycydynq1 小时前
djiango引入django-ckeditor-5-0.2.20 modelform表单
django·django-ckeditor
VidDown10 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
死磕音视频11 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林12 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
pride.li14 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
databook14 小时前
用 Pydantic AI 从零搭建一个能干活的 AI Agent
人工智能·python
康小旺14 小时前
把 markitdown 做成 Windows 桌面版:拖进文档就出 Markdown,附 233MB→64MB 打包裁剪全过程
python
启观川15 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法
南笙北梦15 小时前
本地开源大模型多轮对话显存泄漏排查与修复实录
python