聚合的目的是为了:一次构件多个项目。
对于聚合模块来说,其打包方式为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等命令可以实现裁剪。