maven的聚合与继承

maven的聚合

        当一个子项目下都多个模块,我们需要构建项目时普遍的做法就是进入各个模块逐一构建,但是这样真的是最好的办法么?能不能一次构建两个模块呢?当然可以,maven的聚合特性就是为该需求服务的。

        要实现同时构建多个模块,我们需要在另外创建一个maven项目(聚合模块),然后通过构建该模块来构建其他模块。聚合模块的pom样例如下:

groupid、version:与被聚合模块一致

artifactid:前缀与被聚合模块一致

packaging: 需要注意,与被聚合模块不同,这里的值为pom

name:给项目提供一个更适合阅读的名字,构建时日志输出的是这个名字,而不是artifactid

modules:这里可以申明任意数量的modules来实现模块的聚合,这里的每个moudule的值是当前这个pom的相对路径

        为了方便用户构建项目,一般是将聚合模块放在项目目录的最顶层,其他模块则做为聚合模块的子目录存在。

        当然也是可以使用平行的目录结构,但是响应的module的值要做相应的更改,记住,modules的值是当前pom的相对路径。

maven继承

        很多模块有很多相同的maven配置以及相同的依赖。为了能够减少重复,maven提供了继承的特性。

父模块的例子:

要注意的是packaging的值为pom,groupid、version和其他子模块一致,artifactid 表示这是一个父pom

子模块继承模块的例子:

parent:申明父模块

groupid 、artifactid、version  指定了父模块的坐标,这三个元素是必须的。

relativePath : 父模块的pom相对路径,默认值../pom.xml。构建时,maven会先从relativepath去找父pom,如果没找到再取本地仓库去找.

可继承的常见元素有:

groupid ,version ,properties,dependencyManagement,distributionManagement等等,这里不一一举例。

依赖管理:

dependencyManagement

父pom的片段如下:

properties :提取了相关依赖的版本

dependencyManagement : 申明了项目的依赖,但是该申明不会给当前父模块引入依赖,也不会给子模块映入依赖。但是这段配置却是会被继承的

子pom片段:

如果子模块需要使用父模块里申明的依赖,只需要配置 groupid 和 version 两个元素即可。子模块里没有配置,即使在父模块里申明了,也不会在子模块映入依赖。

虽然这样配置并不能减少太多的配置,但是在dependencyManagement统一申明了依赖版本,就避免了子模块依赖版本不一致的问题。

插件管理:

pluginManagement

父pom片段:

子pom片段:

与依赖管理类似,这里就不在重复说明。

聚合与继承的关系

聚合:

1、主要是为了快速构建项目

2、聚合模块知道被聚合模块,但是被聚合模块不知道聚合模块的存在

继承:

1、主要是为了消除重复

2、父模块不知道哪些子模块继承了它,但是子模块知道他们的父模块

相同点:

1、pakaging都为pom

2、除了pom之外无其他内容

反应堆:

在多组件项目中,反应堆是所有模块组成的一个构建结构;单模块项目,反应堆就是项目本身。但是多模块项目里,反应堆包含了多模块之间的继承和依赖关系,从而能够自动计算出合理的模块构建顺序。

反应堆的构建顺序:

maven按顺序读取pom,如果该模块没有依赖的模块那么就构建该模块,如果有依赖的模块就先去构建依赖的模块,如果依赖的模块还依赖与其他模块,那么就进一步构建依赖的模块。正确的反应堆应该是一个有向非循环图。

剪裁反应堆:

如果用户只想构建反应堆中的某些模块,我们就需要去剪裁反应堆。

主要的参数如下:

猜你喜欢

转载自my.oschina.net/u/2464465/blog/1601331