Maven-继承与聚合
1. 继承简介
1.1 继承的作用
我们知道Maven工程之间可以完成依赖的传递性,实际上就是各个jar包和war包之间存在依赖的传递性,但是必须是compile范围的依赖才具有传递性,才可以根据传递性统一的管理一个依赖的版本。而对于test范围的依赖,只是孤零零的存在于某个项目中,各个项目中的依赖版本可能不同,容易造成问题,所以test范围的依赖的统一版本的问题依靠依赖的传递性是无法解决的。所以我们使用继承这个概念来解决。
1.2 继承的实现
继承,顾名思义,存在着父子关系。我们需要定义一个统一管理某些test范围依赖的父工程,它打包的方式是pom。在它的pom文件中声明test范围的依赖的坐标。然后在子工程中第一以<parent>坐标</parent>的形式声明父工程的坐标并且声明test范围的依赖坐标,子工程中的也要声明test范围的依赖的坐标,但是需要注意的是必须将坐标中的版本号给去掉,才可以完成统一管理test范围依赖的版本。
2. 聚合简介
2.1 聚合的作用
我们最终都要讲各个Maven工程安装到仓库中,但是由于存在继承关系使得我们必选先安装父工程才可以安装子工程,否则会报错。而且必须一个一个的install。那么能不能有一种更好的方式完成一键安装呢?聚合工程就可以完成。
2.2 聚合的实现
我们首先要定义一个打包方式为pom的工程当做聚合工程,并且在其中用<models><model></model></models>标签的形式将一个一个Maven工程聚合进来,不必在意在model中的顺序,它会自动识别父工程来先完成安装。然后只有将这个聚合工程install那么其中聚合进来的工程就都可以顺利的install了。
需要注意的是:在实际项目开发工程中,我们可以使用同一个pom打包方式的工程来充当父工程和聚合工程。即效果是其中的pom.xml文件包含test范围的依赖和models标签将各个Maven工程聚合进来。
3. 继承分析
继承是 Maven 中很强大的一种功能,继承可以使得子POM可以获得 parent 中的各项配置,可以对子pom进行统一的配置和依赖管理。父POM中的大多数元素都能被子POM继承,这些元素包含:
- groupId
- version
- description
- url
- inceptionYear
- organization
- licenses
- developers
- contributors
- mailingLists
- scm
- issueManagement
- ciManagement
- properties
- dependencyManagement
- dependencies
- repositories
- pluginRepositories
- build
- plugin executions with matching ids
- plugin configuration
- etc.
- reporting
- profiles
但是下面的元素,这些都是不能被继承的。
- artifactId
- name
- prerequisites
一个小demo,实现继承如下图:
parent
4. 聚合(或多模块)分析
具有模块的项目被称为多模块或聚合项目。模块是此POM列出并作为一组执行的项目。通过一个pom打包的项目可以将它们列为模块来聚合成一组项目进行构建,这些模块名是这些项目的相对目录。
以下是一个聚合的小demo:
<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>io.fredia</groupId>
<artifactId>femicro</artifactId>
<version>1.0.0-SNAPSHOT</version>
<artifactId>femicro-modules</artifactId>
<packaging>pom</packaging>
<name>femicro-modules</name>
<description>femicro-modules</description>
<modules>
<module>femicro-interface</module>
<module>femicro-admin</module>
<module>femicro-generator</module>
<module>femicro-tool</module>
<module>femicro-database</module>
<module>femicro-graph</module>
</modules>
</project>
在列出模块时,不需要自己考虑模块间依赖关系,即POM给出的模块排序并不重要。Maven将对模块进行拓扑排序,使得依赖关系始终在依赖模块之前构建。
5. 总结
虽然聚合通常伴随着父POM的继承关系,但是这两者不是必须同时存在的,从上面两者的介绍可以看出来,这两者的都有不同的作用,他们的作用不依赖于另一个的配置。
父POM是为了抽取统一的配置信息和依赖版本控制,方便子POM直接引用,简化子POM的配置。聚合(多模块)则是为了方便一组项目进行统一的操作而作为一个大的整体,所以要真正根据这两者不同的作用来使用,不必为了聚合而继承同一个父POM,也不必为了继承父POM而设计成多模块。