Maven实战读书笔记(五):聚合与继承
Maven的聚合特性能够把项目的各个模块聚合在一起构建,而继承特性则能够帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性。
5.1 聚合
Maven聚合也称多模块,能够一次构建多个模块。聚合模块本身是一个Maven项目,所以也有自己的POM文件,该POM文件的packaging为pom,并且含有<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文件的packaging为pom。
子模块需要增加<parent>元素配置:
<parent>
<artifactId>springboot.demo</artifactId>
<groupId>com.wangdh</groupId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
relativePath定义了父模块POM文件的位置。默认值为../pom.xml,Maven默认父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-core、spring-beans、spring-context么?这显然是不合理的。
Maven提供的dependencyManagement元素既能让子模块继承父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下声明的依赖不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。
在父POM使用dependencyManagement声明的依赖能够统一项目范围中依赖的版本,在子模块使用依赖的时候就不需要版本了,只需要简单的配置groupId和artifactId就能获得对应的依赖信息,从而引进正确的依赖。
如果子模块不声明依赖的使用,即使该依赖已经在父POM的dependencyManagement中声明了,也不会产生实际的效果。
如,在父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实战读书笔记(五):聚合与继承的更多相关文章
- 《Maven实战》笔记-5-pom聚合和继承
一.聚合 假设有两个模块:account-email和account-persist: 能够使用一条命令就能构建上述两个模块,需要创建一个额外的模块:account-aggregator: 通过acc ...
- maven实战读书笔记(二)
一个Spring加载属性的工具类,指定目标位置之后可以用${}的方式加载配置文件 测试maven工程发送email的例子:运行成功的例子—github 常用的命令: mvn clean compile ...
- R语言实战读书笔记(五)高级数据管理
5.2.1 数据函数 abs: sqrt: ceiling:求不小于x的最小整数 floor:求不大于x的最大整数 trunc:向0的方向截取x中的整数部分 round:将x舍入为指定位的小数 sig ...
- maven实战读书笔记(三)
maven将一系列的步骤都封装为一系列的插件,运行命令后一系列的插件运行
- maven实战读书笔记(一)
环境变量设置 MAVEN_HOME:G:\maven-3.2\apache-maven-3.2.5 Path: G:\maven-3.2\apache-maven-3.2.5\bin 其实正确的设置应 ...
- Maven实战读书笔记(六):Maven灵活构建
Maven为了支持构建的灵活性,内置了3大特性,即:属性.Profile和资源过滤. 6.1 Maven属性 Maven的属性与Java代码的常量有异曲同工之妙,都是为了消除重复,对相关内容进行统一管 ...
- Maven实战读书笔记(七):Maven常用功能
7.1.资源排除 <resources> <!-- 启动过滤,包含的文件会被过滤掉 --> <resource> <directory>src/main ...
- Maven实战读书笔记(二):Maven坐标与仓库
2.1 Maven坐标 Maven坐标是Maven用来表示一个组件依赖的标示. Maven通过下面几个元素定义坐标:groupId.artifactId.version.packaging.class ...
- Maven实战读书笔记(三):Maven依赖
3.1 依赖的配置 一个依赖声明可以包含下面元素: <dependencies> <dependency> <groupId></groupId> &l ...
随机推荐
- Python2/3共存,pip2/3共存
python2 和 python3设置: 1.安装Python2和3,并添加环境变量: 2.找到python2和python3的安装目录,修改python2中和python3中python.exe和p ...
- python 通过setup.py安装和卸载python软件包
安装:sudo python setup.py install 卸载:sudo python setup.py install --record log sudo cat log | sudo xar ...
- 知乎模拟登录 requests session
Python 3.5 # -*- coding: utf-8 -*- """ Created on Wed May 3 16:26:55 2017 @author: x- ...
- “XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题
“XXX.Index”不扩展类“System.Web.UI.Page”,因此此处不允许的问题 原因:设计页面继承的路径和后台.cs页面类的路径不一致造成的 看下图 这个是设计页面的样式 这个是后台cs ...
- nth Permutation LightOJ - 1060
nth Permutation LightOJ - 1060 题意:给定一个小写字母组成的字符串,对其中所有字母进行排列(排列组合的排列),将所有生成的排列按字典序排序,求排序后第n个排列. 方法:按 ...
- 题解报告:hdu 2141 Can you find it?(二分)
Problem Description Give you three sequences of numbers A, B, C, then we give you a number X. Now yo ...
- android 7.0 应用间文件共享FileProvider
1.官方教程 Android 7.0 以后安全系数提高,应用间文件共享要使用FileProvider.原来的 file:/// Uri 替换为 content://Uri https://devel ...
- 在eclipse中配置Tomcat并将项目部署到Tomcat上
参考:http://blog.csdn.net/yerenyuan_pku/article/details/51830104 首先在点击window窗口然后preferences 然后点击Add,选择 ...
- java容器章节总结
- Apache下禁止使用IP直接访问本站的配置方法
现在管的严啊,上面要求不能使用IP直接访问服务器,把apache配置做下调整就行了.方法如下: 打开apache的配置文件 # vi /usr/local/apache2/conf/extra/htt ...