[toc]
| 单词 | 词性 | 音标 | 含义 |
|---|---|---|---|
| modules | n. (复数) | /ˈmɒdjuːlz/ | 模块集合(Maven多模块项目中,<modules>标签用于声明当前项目包含的子模块,如<modules><module>module-a</module></modules>,指定子模块目录) |
| module | n. | /ˈmɒdjuːl/ | 模块(Maven中表示一个独立的子项目,可单独构建,也可作为父项目的一部分,通过<module>标签在父POM中声明) |
| reactor | n. | /riˈæktə(r)/ | 反应器(Maven术语,指多模块项目构建时的执行顺序管理器,按模块依赖关系自动排序构建流程,确保依赖模块先于使用模块构建) |
| contain | v. | /kənˈteɪn/ | 包含;容纳(编程中表示一个组件包含其他组件,Maven中如父项目contain多个子模块,或集合contain元素) |
| cyclic | adj. | /ˈsaɪklɪk/ | 循环的(编程中常指cyclic reference,即模块间相互依赖形成闭环,如A依赖B,B又依赖A,Maven会报错无法构建) |
| reference | n. / v. | /ˈrefrəns/ | 引用(编程中表示一个模块对另一个模块的依赖引用,cyclic reference即循环引用,会导致构建或运行错误) |
Lecture12 实验07:聚合
1、聚合本身的含义
部分组成整体

动画片《战神金刚》中的经典台词:“我来组成头部!我来组成手臂!”就是聚合关系最生动的体现。
2、Maven 中的聚合
使用一个“总工程”将各个“模块工程”汇集起来,作为一个整体对应完整的项目。
- 项目:整体
- 模块:部分
概念的对应关系:
从继承关系角度来看:
- 父工程
- 子工程
从聚合关系角度来看:
- 总工程
- 模块工程
3、好处
-
一键执行 Maven 命令:很多构建命令都可以在“总工程”中一键执行。
以 mvn install 命令为例:Maven 要求有父工程时先安装父工程;有依赖的工程时,先安装被依赖的工程。我们自己考虑这些规则会很麻烦。但是工程聚合之后,在总工程执行 mvn install 可以一键完成安装,而且会自动按照正确的顺序执行。
-
配置聚合之后,各个模块工程会在总工程中展示一个列表,让项目中的各个模块一目了然。
4、聚合的配置
在总工程中配置 modules 即可:
<modules>
<module>pro04-maven-module</module>
<module>pro05-maven-module</module>
<module>pro06-maven-module</module>
</modules>
5、依赖循环问题
如果 A 工程依赖 B 工程,B 工程依赖 C 工程,C 工程又反过来依赖 A 工程,那么在执行构建操作时会报下面的错误:
[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:
这个错误的含义是:循环引用
6、Maven使用中常见故障排除
①ClassNotFound
明明已经导入了依赖,但是程序运行时抛出ClassNotFound异常,告诉我们某个类找不到,而这个类明明就在我们引入的依赖中
造成这样的问题,有可能是下载过程中,jar包内部丢失数据
解决办法:到本地仓库中把对应的 jar 包删除,让Maven重新下载
- 如何到本地仓库找到 jar 包的位置?通过 jar 包的坐标来找
- 如何让 Maven 重新下载?如下图所示:
注:要想更准确,可以先对 jar 包文件执行 SHA1 计算,对比 SHA1 文件看是否一致
- 一致:说明 jar 包本身是正确的
- 不一致:说明 jar 包确实下载失败,需要重新下载
②lastUpadted问题
Maven 下载 jar 包时,正在下载过程中的 jar 包扩展名是:lastUpdated
如果下载成功,那么就会把lastUpadted去掉,恢复成正确的扩展名
但是如果下载一半儿的时候断网了,lastUpadted扩展名就不会被去掉

如果某个jar包保留lastUpadted扩展名,下次Maven就不会继续下载这个没完成的jar包了
所以需要手动删除这些下载失败的jar包
③莫名其妙的问题
-
确保Project是存放在非中文、没有空格的目录下
-
在Project级别(聚合工程这里)执行 mvn clean install 命令
- 好处1:确保所有被依赖的module都安装到本地库,这里的module说的是我们自己开发的
- 好处2:所有依赖的jar包都执行下载
- 好处3:检查Project中所有Maven工程的pom.xml
-
如果看到下面结果,证明:
- 1、Java代码全部能够通过编译
- 2、所有Maven工程的pom.xml配置全部正确
- 3、IDEA 中所有针对 pom.xml 的报错都是误报

- 如果此时运行程序,还是抛异常,那可以尝试:
- IDEA 重新构建:build菜单---->Rebuild Project
- IDEA 清理缓存并验证重启:File 菜单

在下图中点击 Invalidate and Restart:
