用了 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的聚合和继承吗?的更多相关文章

  1. Maven之 聚合与继承 详解

    说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...

  2. maven的聚合与继承5

    一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...

  3. maven的聚合和继承

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

  4. Maven入门-5.Maven的聚合和继承

    1.Maven的聚合1.1 聚合的配置2.Maven的继承2.1 可被继承的POM元素2.2 POM中使用继承2.3 继承dependency 1.Maven的聚合 在Maven入门-4.Maven的 ...

  5. Maven学习总结(七):Maven的聚合和继承

    一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...

  6. 【maven】---聚合和继承

    前言 自从我知道写maven实战这本书的作者长得随心所欲后,我再拿起这本书真心的不想看前言了.下面分享一下maven中的所谓的聚合和继承. 内容 下文中的子本指的是:多个maven项目. 父本指的是: ...

  7. Maven 梳理 -聚合与继承

    一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...

  8. maven的聚合与继承

    新建一个空的maven项目user-parent Pom.xml内容 <project xmlns="http://maven.apache.org/POM/4.0.0" x ...

  9. Maven中聚合与继承

    何为继承? --›继承为了消除重复,我们把很多相同的配置提取出来 --›例如:grouptId,version等 就像写java程序一样,对于有共性切重复的东西,就提取出来. 如有三个pom.xml配 ...

随机推荐

  1. Java的内存 -JVM 内存管理

    一.综述 如果你学过C或者C++,那么你应该感受过它们对内存那种强大的掌控力.但是强大的能力往往需要更强大的控制力才能保证能力不被滥用,如果滥用C/C++的内存管理那么很容易出现指针满天飞的情况,不出 ...

  2. JS 代码中到底加不加分号

    背景 在写自动执行函数时 vm.$watch('datas', function() { console.log(vm.datas); }) (function () { console.log('t ...

  3. Windows 版本说明,Enterprise、Ultimate、Home、Professional知多少

    关于Windows 的安装光盘版本很多种,很多人不知道选择哪些. Ultimate 旗舰版,VISTA开始有了这个级别,是最全最高级的,一般程序开发的电脑,玩游戏的电脑,建议用它,不过对配置稍有一些要 ...

  4. 聚类——KFCM的matlab程序

    聚类——KFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——KFCM文章中已介绍了KFCM-F算法的理论知识,现在用m ...

  5. linux远程目录共享

    一.环境介绍 1.服务器说明: 有两台服务器,(1)101报表服务器,上面是tomcat跑的原生FineReport报表系统,(2)103业务服务器,上面是具体的业务系统. 2.需求说明: 报表文件由 ...

  6. ansys19.0安装破解教程(图文详解)

    ansys19.0是一款非常著名的大型通用有限元分析(FEA)软件.该软件能够与多数计算机辅助设计软件接口,比如Creo, NASTRAN.Algor.I-DEAS.AutoCAD等,并能实现数据的共 ...

  7. 牛客 小a与星际探索 bfs

    链接:https://ac.nowcoder.com/acm/contest/317/C?&headNav=acm来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ ...

  8. EBS採购模块中的高速接收和高速接收事务

    EBS採购模块中的高速接收和高速接收事务 (版权声明.本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处.否则请与本人联系,违者必究) 高速功能是一个高速输入收货和接收事务的方法. 在收货 ...

  9. [转自机器之心] 刚入校门的PhD们还可以抢救一下(读研读博指南)

    本文作者 Lucy A. Taylor 最近博士毕业,取得了牛津大学跨学科生物科学博士学位. 读博是件难事,一路上可能会遇到很多挫折.失败.崩溃时刻.Lucy 多么希望在开始读博时就能收到一些有益的建 ...

  10. mybatis错误之org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    玩了MyBatis差不多有两年了,中间也玩过MyBatis-Plus,这个MyBatis-Plus其实与MyBatis的区别并不大.今天写博客业务代码的时候,犯一个初学者犯过的错误. 错误信息如下:o ...