概述
Maven项目的核心就是一个pom.xml配置文件,也可以反过来看,一个pom.xml就是一个Maven项目。
如果Maven项目只有一个,那么聚合和继承就都没有了意义。
聚合和继承都是针对Maven多项目多模块管理的:
- 聚合的作用是简化多模块的构建过程
- 继承的目的是精简pom.xml文件的重复配置。
Maven提倡“约定优于配置”,使用聚合和继承特性管理多模块的时候,通常会构建一个父子级的项目目录结构:
pom.xml -- 父级Maven项目:example-parent
pom.xml -- 子级Maven项目:example-a
pom.xml -- 子级Maven项目:example-b
pom.xml -- 子级Maven项目:example-c
基于这样的一个约定的Maven项目结构,我们来说说聚合和继承的使用方法。
聚合
父级项目的pom.xml
精简配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>example-parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<!-- modules就是聚合的配置 -->
<modules>
<module>example-a</module>
<module>example-b</module>
<module>example-c</module>
</modules>
</project>
这段配置有两个要点:
- packaging为pom,表示这是Maven的组织项目,是起管理作用的,pom全称是Project Object Model
- module就是多个被管理的子项目,或者叫子模块,其值是子模块相对于父级pom.xml文件的相对路径
有了这段配置,Maven的多模块构建过程就简单了。
构建的过程就是Maven的生命周期:清理、验证、编译、测试、打包、检查、安装、部署。
- 对父级项目执行清理,各个子模块也会被清理
- 对父级项目执行编译,各个子模块也会被编译
- 对父级项目执行测试、各个子模块也会被测试
- 对父级项目执行打包,各个子模块也会被打包
- 依次类推,Maven生命周期的所有过程都是一样的道理
如果Maven没有聚合能力,每个子模块就需要单独执行生命周期的各个阶段,那么,执行构建的过程必然存在大量重复性的工作。
对于一个优秀的程序员来说,重复就意味的设计的不合理!
继承
父级项目的pom.xml
精简配置如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>example-parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
</project>
这段配置核心就一个:
- packaging为pom,表示这是Maven的组织项目,是起管理作用的,pom全称是Project Object Model
继承的核心配置体现在子模块的pom.xml文件中:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.example</groupId>
<artifactId>example-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>example-a</artifactId>
</project>
子模块配置pom.xml核心有两个:
- parent节点声明了父级管理项目,证明这是个子模块,父子关系由此建立
- Maven坐标少了groupId和version配置,因为这两个属性可从父亲那里“继承”
父子关系有了,属性也可以继承,那么,子模块里的相同配置就都可以提取到父级pom.xml文件中,这就消除了子模块里的重复配置。
对于一个优秀的程序员来说,重复配置必须消除!
至于pom.xml文件里有哪些配置可以继承,就请自行百度,不展开了。
总结
- 聚合和继承是Maven管理能力的一体两面,目的都是为了“消除重复”,可以一起使用
- 聚合是为了提高多模块的构建效率
- 继承是为了精简pom.xml的配置内容
- 聚合和继承的项目结构不一定非要是父子,也可以是其它目录结构,区别就是多点配置