类之间有聚合和继承关系,Maven也具备这样的设计原则。那么Maven的pom是如何进行聚合与继承的呢?
上一篇博客介绍了模块化的基本知识。有了模块化,那么我们项目中会有很多模块,每个模块都是独立的maven project,如果项目不大,我们还可以独立的编译测试运行每个模块,但是随着项目越来越大,我们不得不想办法让我们的工作变得简单,这时就出现了Maven聚合的方式来完成编译所有模块。
聚合:把多个模块或项目聚合到一期,我们可以建立一个专门负责聚合工作的project.
Maven聚合:当我们的模块非常多的时候,我们想要一次构建多个项目,而不是到多个模块的目录下分别执行命令。Maven的聚合特性就是为该需求服务的。
Pom.xml:
<parent> <groupId>com.tgb</groupId> <artifactId>itoo-root</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 继承itoo-root的pom文件 --> <relativePath>../itoo-root/pom.xml</relativePath> </parent> <artifactId>itoo-basic-parent</artifactId> <packaging>pom</packaging> <modules> <module>../itoo-basic-api</module> <module>../itoo-basic-institution-core</module> <module>../itoo-basic-institution-web</module> <module>../itoo-basic-institution-ear</module> </modules>
Maven约定:
1、首先聚合模块必须为pom,否则无法构建
2、必须有<modules>元素,它是实现聚合的最核心配置。这里可以声明多个module元素。每个module的值都是一个当前pom的相对目录。模块所处的目录必须和<module>模块所处的目录一致。
3、为了方便用户构建项目,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录存在。
4、聚合模块的pom没有实质性内容,只有一个pom.xml文件。只是用来帮助其他模块构建的工具。
maven构建:
maven首先解析聚合模块pom、分析要构建的模块、并计算出一个反应堆构建顺序,然后根据这个顺序依次构建各个模块。反应堆是所有模块组成的一个构建结构。
Maven继承也是为了防止重复,让项目的jar包版本一致,在项目管理上起了很大的作用。
比如说相同的jar包我们每个人都需要依赖一遍,并且每个人引用的版本号不同,势必造成项目混乱,运行出问题。
1、子模块省略grouopId和version,都会从父模块依赖下来。
2、子模块元素pom.xml:
<parent> <groupId>com.tgb</groupId> <artifactId>itoo-root</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 继承itoo-root的pom文件 --> <relativePath>../itoo-root/pom.xml</relativePath> </parent>
随之而来的问题,如果我创建了一个模块不需要依赖父类的依赖,这时候我们需要用Maven的依赖管理来解决这个问题。即dependencyManagement。见
Maven实战(六)---dependencies与dependencyManagement的区别
对于聚合模块来说,它知道有哪些被聚合的模块,而对于被聚合的模块来说,它们不知道被谁聚合了,也不知道它的存在;对于继承关系的pom来说,它不知道被哪些模块继承了,对于子pom来说,它必须知道要继承谁。
总之,聚合是为了方便快速构建项目,继承是为了消除重复配置,在简化pom的同时还能促进各个模块配置的一致性。共同点是两者的packaging都是pom,聚合模块与继承关系中的父模块除了pom之外都没有实际内容。
实际项目中我们会发现,一个pom既是聚合pom,也是父pom,这么做主要是为了方便。
Java成功的重要原因之一就是他能够屏蔽大部分操作系统的差异,XML流行的原因之一是所有语言都接受他。Maven用的人越来越多是Maven提倡约定优于配置,这是Maven最核心的设计理念之一。