Maven的聚合特性能够把项目的各个模块聚合在一起构建,而继承特性则能够帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性。

5.1 聚合

Maven聚合也称多模块,能够一次构建多个模块。聚合模块本身是一个Maven项目,所以也有自己的POM文件,该POM文件的packagingpom,并且含有<modules><module>元素,如:

<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>com.wangdh</groupId>
<artifactId>springboot.demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>springboot-mybatis</module>
<module>springboot-web</module>
<module>springboot-quickstart</module>
</modules>
</project>

这里每个module的值都是一个当前POM的相对目录,一般而言,为了方便快速定位内容,模块所处的目录名称应该与其artifactId一致,不过这不是Maven的要求。

因此,聚合模块与其他模块的目录结构并非一定要父子关系,通过修改module的值,也能更改为平级关系:

<module>../springboot-quickstart</module>

Maven首先会解析聚合模块的POM,分析要构建的模块,并计算出一个反应堆构建顺序,然后根据这个顺序依次构建各个模块。反应堆包含了模块之间继承和依赖的关系。模块间的依赖关系会将反应堆构成一个有向非循环图。

5.2 继承

继承解决的是对重复依赖和插件配置的抽取。通过定义一个父模块,将其他模块相同的配置抽离到父模块中,然后继承父模块,并且父模块也是一个Maven项目,其POM文件的packagingpom

子模块需要增加<parent>元素配置:

<parent>
<artifactId>springboot.demo</artifactId>
<groupId>com.wangdh</groupId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

relativePath定义了父模块POM文件的位置。默认值为../pom.xmlMaven默认父POM在上一层目录下。

POM文件可被继承的元素有:

groupId:项目组ID,项目坐标的核心元素
version:项目版本,项目坐标的核心元素
description:项目的描述信息
organization:项目所在组织机构信息
inceptionYear:项目的创始年份
url:项目的URL地址
developers:项目的开发者信息
contributors:项目的贡献者信息
distributionManagement:项目的部署配置
issueManagement:项目的缺陷跟着系统信息
ciManagement:项目的持续集成系统信息
scm:项目的版本控制系统信息
mailingLists:项目的邮件列表信息
properties:自定义的Maven属性
dependencies:项目的依赖配置
dependencyManagement:项目的依赖管理配置
repositories:项目的仓库配置
build:项目的源码目录配置、输出目录配置、插件配置、插件配置管理等
reporting:项目的报告输出目录配置、报告插件配置等

5.3 聚合与继承比较

对于Maven聚合,聚合模块知道他聚合了哪些模块,但是被聚合模块不知道它自己被谁聚合了;

对于Maven继承,子模块知道自己的父模块是谁,但父模块不知道自己有多少子模块。

在实际使用过程中聚合模块和父模块是同一个模块。

5.4 依赖管理

子模块继承父模块时,也会继承父模块的依赖配置,假设添加一个util的子模块,该模块只提供一些简单的帮助工具,与springframework完全无关,难道也让它依赖spring-corespring-beansspring-context么?这显然是不合理的。

Maven提供的dependencyManagement元素既能让子模块继承父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下声明的依赖不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。

在父POM使用dependencyManagement声明的依赖能够统一项目范围中依赖的版本,在子模块使用依赖的时候就不需要版本了,只需要简单的配置groupIdartifactId就能获得对应的依赖信息,从而引进正确的依赖。

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

如,在父POM定义如下dependencyManagement

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>

在子模块使用时,只需要:

 <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>

对于子模块而言,可以按需添加依赖,对于整个项目而言,可以规范对依赖的版本号管理。

Maven实战读书笔记(五):聚合与继承的更多相关文章

  1. 《Maven实战》笔记-5-pom聚合和继承

    一.聚合 假设有两个模块:account-email和account-persist: 能够使用一条命令就能构建上述两个模块,需要创建一个额外的模块:account-aggregator: 通过acc ...

  2. maven实战读书笔记(二)

    一个Spring加载属性的工具类,指定目标位置之后可以用${}的方式加载配置文件 测试maven工程发送email的例子:运行成功的例子—github 常用的命令: mvn clean compile ...

  3. R语言实战读书笔记(五)高级数据管理

    5.2.1 数据函数 abs: sqrt: ceiling:求不小于x的最小整数 floor:求不大于x的最大整数 trunc:向0的方向截取x中的整数部分 round:将x舍入为指定位的小数 sig ...

  4. maven实战读书笔记(三)

    maven将一系列的步骤都封装为一系列的插件,运行命令后一系列的插件运行

  5. maven实战读书笔记(一)

    环境变量设置 MAVEN_HOME:G:\maven-3.2\apache-maven-3.2.5 Path: G:\maven-3.2\apache-maven-3.2.5\bin 其实正确的设置应 ...

  6. Maven实战读书笔记(六):Maven灵活构建

    Maven为了支持构建的灵活性,内置了3大特性,即:属性.Profile和资源过滤. 6.1 Maven属性 Maven的属性与Java代码的常量有异曲同工之妙,都是为了消除重复,对相关内容进行统一管 ...

  7. Maven实战读书笔记(七):Maven常用功能

    7.1.资源排除 <resources> <!-- 启动过滤,包含的文件会被过滤掉 --> <resource> <directory>src/main ...

  8. Maven实战读书笔记(二):Maven坐标与仓库

    2.1 Maven坐标 Maven坐标是Maven用来表示一个组件依赖的标示. Maven通过下面几个元素定义坐标:groupId.artifactId.version.packaging.class ...

  9. Maven实战读书笔记(三):Maven依赖

    3.1 依赖的配置 一个依赖声明可以包含下面元素: <dependencies> <dependency> <groupId></groupId> &l ...

随机推荐

  1. Codeforces Round #355 (Div. 2)C - Vanya and Label

    啊啊啊啊啊啊啊,真的是智障了... 这种题目,没有必要纠结来源.只要知道它的结果的导致直接原因?反正这句话就我听的懂吧... ">>"/"&" ...

  2. python 字符串函数功能快查

    0.dir(str)一.有字符发生转换1.capitalize,字符串的第一个字符大写2.casefold,将所有字符小写,Unicode所有字符均适用3.lower,将所有字符小写,只适用ASCii ...

  3. 【POJ - 3190 】Stall Reservations(贪心+优先队列)

    Stall Reservations 原文是English,这里直接上中文吧 Descriptions: 这里有N只 (1 <= N <= 50,000) 挑剔的奶牛! 他们如此挑剔以致于 ...

  4. 3.bool布尔值int,str的转化,字符串的常用方法,字符串format,is判断(字符串的数字),for循环

    1.bool 布尔值 bool 布尔值 -- 用于条件使用 True 真 False 假 True 真 False 假 print(bool(-10)) # 0 是 False 非0的都是True p ...

  5. 左耳朵耗子:我为什么要在极客时间 App 开设独家专栏?

    参考链接:https://www.infoq.cn/article/2018/01/why-geektime 不少朋友都知道我在极客时间App 上开了一个收费专栏<左耳听风>,这个专栏会开 ...

  6. jQuery笔记之位置图形

    位置图形: 位置坐标图形大小相关方法: .offset() .position() .scrollTop()..scrollLeft() .width().height() .innerWidth() ...

  7. web.xml报错:Invalid content was found starting with element 'init-param'

    问题与分析 在web.xml中配置servlet节点时报错如下: cvc-complex-type.2.4.a: Invalid content was found starting with ele ...

  8. Educational Codeforces Round 19 B

    Description You are given sequence a1, a2, ..., an of integer numbers of length n. Your task is to f ...

  9. 洛谷 P2398 GCD SUM || uva11417,uva11426,uva11424,洛谷P1390,洛谷P2257,洛谷P2568

    https://www.luogu.org/problemnew/show/P2398 $原式=\sum_{k=1}^n(k\sum_{i=1}^n\sum_{j=1}^n[(i,j)=k])$ 方法 ...

  10. Windows下DVWA安装指南

    注意:DVWA需要依赖httpd.PHP.MySQL.php-mysql等应用或组件,最简单的方法是安装wampserver(http://www.wampserver.com/),安装完了所需的各种 ...