第一部分: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。
-
先建普通Maven Java项目
-
删掉无用的src目录,留pom.xml
-
把
<packaging>改成pompom
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
⭐ 老师强调 :聚合让多模块构建统一化 ,不必逐个项目操作。易混淆点是继承与聚合常并存但概念不同------继承是子模块复用父配置,聚合是父统管构建动作。