聚合的目的是为了:一次构件多个项目。

对于聚合模块来说,其打包方式为pom,不需要src/main/java之类的文件。

用户可以在一个打包方式为pom的Maven项目中声明任意数量的module元素,来实现模块的聚合。这里的每个module的值都是一个当前POM的相对目录。

继承:

继承的目的是为了:消除重复的配置。

继承就是把共同的配置放在一个父模块中,父模块打包方式为pom,不需要src/main/java之类的文件。

子模块中需要声明<parent>,其中<relativePath>表示父模块POM的相对路径,当项目构建时,Maven会首先根据<relativePath>检查父POM,如果找不到,再从本地仓库查找。

如果子模块与父模块的<groupId>、<version>相同,则子模块可以省略关于<groupId>、<version>的配置。

可以继承的父模块元素:

<groupId>、<version>、<distributionManagement>、<properties>、<dependencies>、<dependencyManagement>、<repositories>。

依赖管理:

<dependencyManagement>元素帮助管理依赖,在该元素中配置的依赖不会造成实际的插件调用行为,当POM中配置了真正的plugin元素,并且其<groupId>、<artifactId>与<dependencyManagement>中配置的插件匹配时,<dependencyManagement>的配置才会影响实际的插件行为。通过这样的方式,既能让子模块继承到父模块的依赖配置,又能保证了子模块依赖使用的灵活性。

Import的依赖范围:

该依赖范围通常指向一个POM,作用是将目标POM中的<dependencyManagement>配置导入并合并到当前POM的<dependencyManagement>元素中。Import范围依赖由于其特殊性,一般都是指向打包类型为pom的模块。

插件管理:

<pluginManagement>元素帮助管理插件,同<dependencyManagement>一样,在该元素中配置的依赖不会造成实际的插件调用行为,当POM中配置了真正的plugin元素,并且其<groupId>、<artifactId>与<pluginManagement>中配置的插件匹配时,<pluginManagement>的配置才会影响实际的插件行为。

聚合与继承的关系:

聚合是为了方便快速构建项目,而继承是为了消除重复配置。

它们的相同点是:打包方式都是pom,除了pom文件之外没有其他实际的内容。

不同点:聚合是聚合模块通过module引用被聚合模块,而继承是子模块通过parent引用父模块。

实际项目中通常把聚合和继承结合起来一起使用。parent项目既是聚合模块,也是父模块。

约定优于配置:

约定:其实就是默认配置

源码目录:src/main/java/

编译输出目录:target/classes

打包方式:jar

包输出目录:target/

之所以会有这些默认配置,是因为有超级POM的存在,超级POM里面配置了这些内容。

对于Maven3,超级POM在文件$MAVEN_HOME/lib/maven-module-builder-x.x.x.jar中的org/apache/maven/model/pom-4.0.0.xml路径下。

反应堆:

在一个多模块的Maven项目中,反应堆是指所有模块组成的一个构建结构。对于单模块项目,反应堆就是该模块本身,但对于多模块项目来说,反应堆就包括了各个模块之间继承与依赖的关系,从而自动计算出合理的模块构建顺序。

实际的构建顺序是这样形成的:Maven按顺序读取POM,如果该POM没有依赖模块,那么就构建该模块,如果该依赖还依赖于其他模块,则进一步先构建依赖的依赖。形成一个有向非循环图(DAG)。

裁剪反应堆:如果想要构建完整反应堆的某个模块,则需要裁剪。 -am, -amd, -pl, -rf等命令可以实现裁剪。