第八章 聚合与继承

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第八章 聚合与继承相关的知识,希望对你有一定的参考价值。

参考技术A

一、聚合

想要一次构建两个项目,而不是到两个模块目录下分别执行mvn命令。

为了能使用一条命令构建两个模块,需要创建一个额外的模块account-aggregator,然后通过该模块构建整个项目的所有模块。这个account-aggregator模块作为一个Maven项目,有自己的POM,同时作为聚合项目,又有特殊点:

特殊的地方之一为packaging,值为pom。对于聚合模块来说,其打包发送packaging值必须为pom,否则无法构建。

元素modules,是实现聚合的最核心的配置。可以通过在一个打包发送为pom的Maven项目中声明容易数量的module元素来实现聚合模块。每个module的值都是一个当前POM的相对目录。

一般来说,为了方便快速定位内容,模块所处目录名称应当与其artifactId一致,不过这不是Maven的要求。

为了方便构建项目,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录存在。不一定要是父子关系,可以是平行目录。

如果使用平行目录结构,聚合模块的POM需要修改,指向正确的目录:

聚合模块仅有一个pom.xml文件,仅仅帮助聚合其他模块构建。最后在聚合模块运行mvn clean install命令。

Maven首先解析聚合模块的POM、分析要构建的模块、计算出一个反应堆构建顺序,然后根据这个顺序依次构建各个模块。

在POM中配置合理的name字段,目的是让Maven构建输出更清晰。

二、继承

抽取重复的配置。需要创建POM的父子结构,然后在父POM中声明一些配置供子POM继承,实现“一处声明,多处使用”。

继续以上面的为基础,在account-aggregator下创建一个名为account-parent的子目录,然后在该目录下建立一个除account-aggregator之外的父模块。为此,在该子目录建一个pom.xml文件:

它使用和其他模块一致的groupId和version,使用artifactId为account-parent表示父模块。packaging为pom。不包含除POM以外的文件。

父模块需要其他模块继承。修改子模块的POM:

使用parent元素声明父模块,parent下的groupId、artifactId和version指定父模块坐标。relativePath元素表示父模块POM的相对路径。当项目构建时,Maven会根据relativePath检查父POM,如果找不到,再从本地仓库找。默认值是../pom.xml,即默认父POM在上层目录下。

更新过的POM没有为account-email声明groupId和version,这个子模块隐式的从父模块继承了这两个元素。子类也可以显示声明该两个元素不同的值。对于artifactId元素,子模块应该显式声明。

可继承的POM元素

依赖管理

Maven提供的dependencyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活。在dependencyManagement下的依赖声明不会引入实际的依赖,不过能约束dependencies下的依赖使用。在account-parent中加入该配置:

这段配置会被继承。修改account-email的POM:

所有的springframework依赖只配置了groupId和artifactId,junit省去了version和scope。原因是继承了父pom的dependencyManagement配置。

如果子模块不声明依赖的使用,即使父POM声明了该依赖,也不会产生实际效果。

import范围依赖,该依赖只中dependencyManagement元素下才有效,使用该范围的依赖通常指向一个POM,作用是将目标POM中的dependencyManagement配置导入并合并到当前POM的dependencyManagement中。

插件管理

提供pluginManagement元素管理插件。在该元素配置的插件不会造成实际插件调用,当pom中配置了真正的plugin元素,并且其groupId和artifactId与该元素中配置的插件匹配时,该元素配置才会影响实际插件效果。

如果子模块不需要使用父模块中pluginManagement配置的插件,可以忽略。需要配置不同插件,可以自行配置覆盖父模块配置。

四、聚合与继承关系

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

聚合与继承的父模块的POM的packaging必须是pom;聚合模块和继承关系的父模块只有POM。

五、约定优于配置

约定可以大量减少配置。Maven假设目录:

Maven允许自定义源码目录,除非特殊情况,不建议这样做。

Maven设定核心插件原因是防止由于插件版本的变化而造成构建不稳定。

六、反应堆

在一个多模块的Maven项目中,反应堆(Reactor)指所有模块组成的一个构建结构。对于单模块项目,反应堆就是本身,对于多模块项目,反应堆包含各模块间的继承和依赖关系,从而能计算出合理的模块构建顺序。

1.反应堆构建顺序

修改account-aggregator聚合配置如下:

POM的读取次序不足以决定反应堆构建顺序,要考虑模块间的依赖和继承关系。

实际的构建顺序是:Maven按序读取POM,如果该POM没有依赖模块,那么构建该模块,否则先构建其依赖模块,如果该依赖还依赖于其他模块,则进一步构建依赖的依赖。

2.裁剪反应堆

Maven提供命令行选项裁剪反应堆,mvn-h可以看到这些选项:

在-pl -am或者-pl -amd基础上,还能应用-rf参数,以对裁剪后的反应堆再次裁剪。

以上是关于第八章 聚合与继承的主要内容,如果未能解决你的问题,请参考以下文章

第八章 类对象的特性

第八章

《快学Scala》第八章——继承

MYSQL-第八章

JAVA-初步认识-第八章-继承-子父类中成员变量的特点

JAVA-初步认识-第八章-继承-子父类中成员函数特点-覆盖