你分得清楚Maven的聚合和继承吗?
用了 Maven 好几年了,许多人还是只懂得简单的依赖坐标。对于 Maven 的聚合和继承还是一知半解,甚至很多人以为是同一个东西。但其实聚合是用于快速构建项目,是表示项目与子项目之间的关系。而继承则是为消除重复的配置。下面通过一个例子深入聊聊这两者的关系。
聚合
Maven 的聚合其实就是项目与子项目的表示,其存在的意义在于快速构建项目。例如我们有一个淘宝商城项目,这个项目有账号子项目和邮件子项目。在这个时候我们需要在 Maven 中表达这种项目归属关系,那么我们就可以用 Maven 的聚合来进行配置。
我们首先创建一个 taobao-aggregator 项目,表示是一个聚合项目。之后再创建两个子项目,分别为:com.chenshuyi.mail 和 com.chenshuyi.account。
//taobao-aggregator pom.xml
<groupId>com.chenshuyi</groupId>
<artifactId>taobao-aggregator</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>taobao-aggregator</name>
<modules>
<module>mail</module>
<module>account</module>
</modules>
可以看到 taobao-aggregator 的 pom.xml 文件中多了一个 modules 元素,其中包含了两个子模块。在 Maven 中我们通过 modules 元素来表示模块之间的关联关系。
在 Maven 的聚合关系中,聚合项目知道哪些项目是它的子项目,但是那些被聚合的项目并不知道其被哪个模块聚合了。
一般情况下子项目都是在父项目的子目录下,但你也可以把子项目放在与父项目同级的地方,只要你修改一下module
元素的值即可。
//taobao/account/mail同级
<modules>
<module>../account</module>
<module>../mail</module>
</modules>
继承
Maven 的继承是为了消除重复配置而存在的。例如我们的 account 子模块和 mail 子模块都需要 junit-test 依赖,但是都得在自己的模块里都写一次,这样岂不是会造成代码的重复。这个时候就可以将共同的依赖写在父类模块中,让子类继承这些依赖。
例如 taobao-parent 是 mail 模块和 account 模块的父模块,他们都需要 junit 测试依赖包。那么此时在 taobao-parent 项目的 dependencies 元素中声明该依赖。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
mail 模块和 account 模块中增加一个 parent 元素声明,表明其父级是 taobao-parent 项目。
<parent>
<artifactId>taobao-parent</artifactId>
<groupId>com.chenshuyi</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
经过这么一个配置之后,Maven 就只知道他们的依赖关系。此时 taobao 项目 dependencies 元素里声明的依赖就会全部继承到子项目中。这样子项目中就不需要再去声明多一次了,节省了不必要的配置。
像 dependencies 这样可以被子类继承的元素还有下面几个元素:
- groupId
- version
- description
- organization
- inceptionYear
- url
- developers
- contributors
- distributionManagement
- issueManagement
- ciManagement
- scm
- mailingLists
- properties
- dependencies
- dependencyManagement
- repositories
- build
- reporting
聚合与继承的关系
从上面可以看到多模块 Maven 项目中的聚合与继承其实是两个概念,其目的是完全不同的。聚合是为了方便快速构建项目,继承是为了消除重复配置。
对于聚合模块来说,它知道哪些被聚合的模块(通过modules元素),但那些被聚合的模块不知道这个聚合模块的存在。
对于继承关系的父 POM 来说,它不知道哪些子模块继承于它,但那些子模块都必须知道自己的父 POM 是什么。
在实际项目中,大家会发现一个 pom 即是聚合 pom,又是父 pom,这么做主要是为了方便。就像上面我们定义的聚合模块为 taobao-aggregator,父级模块为 taobao-parent,我们可以将其合并成为一个名为 taobao 的 pom 文件。这样清晰明了。
总结
如果看完本文还是不理解,那么可以自己去看下《Maven实战》中关于聚合和继承的讲解,里面讲得更加细致。
你分得清楚Maven的聚合和继承吗?的更多相关文章
- Maven之 聚合与继承 详解
说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...
- maven的聚合与继承5
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...
- maven的聚合和继承
Maven的聚合特性能够把项目的各个模块聚合在一起构建: 而Maven的继承特性则能帮组抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能促进各个模块配置的一致性. 聚合:新建一个项目demo ...
- Maven入门-5.Maven的聚合和继承
1.Maven的聚合1.1 聚合的配置2.Maven的继承2.1 可被继承的POM元素2.2 POM中使用继承2.3 继承dependency 1.Maven的聚合 在Maven入门-4.Maven的 ...
- Maven学习总结(七):Maven的聚合和继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...
- 【maven】---聚合和继承
前言 自从我知道写maven实战这本书的作者长得随心所欲后,我再拿起这本书真心的不想看前言了.下面分享一下maven中的所谓的聚合和继承. 内容 下文中的子本指的是:多个maven项目. 父本指的是: ...
- Maven 梳理 -聚合与继承
一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...
- maven的聚合与继承
新建一个空的maven项目user-parent Pom.xml内容 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...
- Maven中聚合与继承
何为继承? --继承为了消除重复,我们把很多相同的配置提取出来 --例如:grouptId,version等 就像写java程序一样,对于有共性切重复的东西,就提取出来. 如有三个pom.xml配 ...
随机推荐
- Android--手势及触摸事件的注意点(一)
实现onInterceptTouchEvent方法可以用来拦截父ViewGroup传递下来的所有触屏事件,可以将所有触屏事件交由此ViewGroup自身的onTouchEvent来处理,也可以继续传递 ...
- Android权限之动态权限
安卓系统的权限管理机制从API 23 (也就是Android 6.0 又叫做 Android M,)之后发生了比较大的改变,在一些比较危险的权限上要求必须申请动态权限,即使你在AndroidMainf ...
- (办公)rom包
所谓ROM包,通俗点来讲,也就是手机上的系统安装包.使用过智能手机的朋友可能都有过这样的遗憾,自己所用的官方系统虽然能够满足绝大部分的需求,但总有一些细节不是很合自己的心愿……比如说,内置的输入法不好 ...
- HBase最佳实践之Scan
一.简介 HBase中Scan从大的层面来看主要有三种常见用法:ScanAPI.TableScanMR以及SnapshotScanMR.三种用法的原理不尽相同,扫描效率当然相差甚远,最重要的是这几种用 ...
- springmvc复习笔记----springmvc姓名年龄例子:RequestParam 试水
继续 继上节http://www.cnblogs.com/tk55/p/6652394.html 重要部分颜色突出 结构 包 web.xml 乱码处理方面设置 <url-pattern>* ...
- 修正Percona Monitoring Plugins for Zabbix的一处脚本Bug
今天小试了一把Percona Monitoring Plugins for Zabbix模板,自己辛辛苦苦写的那一大堆Python脚本,貌似用这个模板全都覆盖到了.但是,我也发现最新的版本percon ...
- Elasticsearch深入搜索之结构化搜索及JavaAPI的使用
一.Es中创建索引 1.创建索引: 在之前的Es插件的安装和使用中说到创建索引自定义分词器和创建type,当时是分开写的,其实创建索引时也可以创建type,并指定分词器. PUT /my_index ...
- [Hive_3] Hive 建表指定分隔符
0. 说明 Hive 建表示例及指定分隔符 1. Hive 建表 Demo 在 Hive 中输入以下命令创建表 user2 create table users2 (id int, name stri ...
- VueJs入门(一)
VueJs学习笔记:基本概念及简单demo Vue官方介绍:简单小巧的核心,渐进式技术栈,足以应付任何规模的应用. 简单小巧指的是vue.js压缩后仅有17KB,量轻.渐进式指的是我们学习和使用vue ...
- css点滴2—六种方式实现元素水平居中
本文参考文章<六种方式实现元素水平居中> 元素水平居中的方法,最常见的莫过于给元素一个显式的宽度,然后加上margin的左右值为auto.这种方式给固定宽度的元素设置居中是最方便不过的.但 ...