周其仁:停止改革,我们将面临三大麻烦

抛开立场观点不谈,且看周小平写一句话能犯多少语病

罗马尼亚的声明:小事件隐藏着大趋势——黑暗中的风:坚持做对的事相信未来的结果

布林肯突访乌克兰,为何选择去吃麦当劳?

中国不再是美国第一大进口国,贸易战殃及纺织业? 美国进一步延长352项中国商品的关税豁免期

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

Maven的聚合和继承有什么区别?

陈树义 树哥聊编程 2022-07-30

点击关注Java技术精选”,择“置顶或者星标”

精选最新技术文章,与你一起成长


用了 Maven 好几年了,许多人还是只懂得简单的依赖坐标。对于 Maven 的聚合和继承还是一知半解,甚至很多人以为是同一个东西。但其实聚合是用于快速构建项目,是表示项目与子项目之间的关系。而继承则是为消除重复的配置。下面通过一个例子深入聊聊这两者的关系。

聚合

Maven 的聚合其实就是项目与子项目的表示,其存在的意义在于快速构建项目。例如我们有一个淘宝商城项目,这个项目有账号子项目和邮件子项目。在这个时候我们需要在 Maven 中表达这种项目归属关系,那么我们就可以用 Maven 的聚合来进行配置。

我们首先创建一个 taobao-aggregator 项目,表示是一个聚合项目。之后再创建两个子项目,分别为:com.chenshuyi.mail 和 com.chenshuyi.account。

  1. //taobao-aggregator pom.xml

  2. <groupId>com.chenshuyi</groupId>

  3. <artifactId>taobao-aggregator</artifactId>

  4. <version>1.0-SNAPSHOT</version>

  5. <packaging>pom</packaging>

  6. <name>taobao-aggregator</name>

  7. <modules>

  8.    <module>mail</module>

  9.    <module>account</module>

  10. </modules>

可以看到 taobao-aggregator 的 pom.xml 文件中多了一个 modules 元素,其中包含了两个子模块。在 Maven 中我们通过 modules 元素来表示模块之间的关联关系。

在 Maven 的聚合关系中,聚合项目知道哪些项目是它的子项目,但是那些被聚合的项目并不知道其被哪个模块聚合了。

一般情况下子项目都是在父项目的子目录下,但你也可以把子项目放在与父项目同级的地方,只要你修改一下 module元素的值即可。

  1. //taobao/account/mail同级

  2. <modules>

  3.    <module>../account</module>

  4.    <module>../mail</module>

  5. </modules>

继承

Maven 的继承是为了消除重复配置而存在的。例如我们的 account 子模块和 mail 子模块都需要 junit-test 依赖,但是都得在自己的模块里都写一次,这样岂不是会造成代码的重复。这个时候就可以将共同的依赖写在父类模块中,让子类继承这些依赖。

例如 taobao-parent 是 mail 模块和 account 模块的父模块,他们都需要 junit 测试依赖包。那么此时在 taobao-parent 项目的 dependencies 元素中声明该依赖。

  1. <dependencies>

  2.    <dependency>

  3.        <groupId>junit</groupId>

  4.        <artifactId>junit</artifactId>

  5.        <version>4.11</version>

  6.        <scope>test</scope>

  7.    </dependency>

  8. </dependencies>

mail 模块和 account 模块中增加一个 parent 元素声明,表明其父级是 taobao-parent 项目。

  1. <parent>

  2.    <artifactId>taobao-parent</artifactId>

  3.    <groupId>com.chenshuyi</groupId>

  4.    <version>1.0-SNAPSHOT</version>

  5. </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实战》中关于聚合和继承的讲解,里面讲得更加细致。



公众号@Java技术精选,关注 Java 程序员的个人成长,分享最新技术资讯与技术干货。与你成长有关的,我们这里都有。


↑↑原创不易,如果喜欢请转发↑↑



文章有问题?点此查看未经处理的缓存