maven中的module及聚合项目
PPT地址:https://github.com/WuZhiyong1759/xiaoketangPPT/tree/master/XKT2017%E5%B9%B46%E6%9C%8809%E6%97%A5PPT
分享人:吴志勇
1、背景介绍
modules
从字面意思来说,module就是模块,而pom.xml中的modules也正是这个意思,用来管理同个项目中的各个模块;如果maven用的比较简单,或者说项目的模块在pom.xml没进行划分,那么此元素是用不到的;不过一般大一点的项目是要用到的。
如果我们的项目分成了好几个模块,那么我们构建的时候是不是有几个模块就需要构建几次了(到每个模块的目录下执行mvn命令)?当然,你逐个构建没问题,但是非要这么麻烦的一个一个的构建吗,那么简单的做法就是使用聚合,一次构建全部模块
2、知识剖析
1)什么是maven聚合项目
2)如何创建一个maven的聚合项目
3)和普通的maven项目相比聚合项目有什么特点
4)各个module之间的关系是怎样的
3、常见问题
聚合项目中的pom文件配置是什么样子的
4、解决方案
百度
1)maven聚合项目也就是多模块项目,(根据项目需求,把功能或服务划分成不同的模块进行开发,子模块继承父类通过maven统一管理,聚合)
2)创建一个maven聚合项目
第一步
建立一个普通的maven Java工程(并删除掉src文件夹)
第二部
右击项目名选择新建module
输入模块名
建立多个module后目录结构如下:
此时聚合项目已建成父类pom为:
子类module的pom为:
3)和普通项目相比聚合项目的父类pom文件的packaging的值为pom,在父类中有指向子类的<modules>元素,在子类的pom中有有指向父类的<parent>元素,每个module的目录结构和一般的maven项目没有区别。在父类pom中添加的依赖在子pom中可以继承
4)对于聚合模块来说,它知道哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。
对于继承关系的父pom来说,它不知道有哪些子模块继承与它,但那些子模块都必须知道自己的父pom是什么。
5、编码实战
见视屏
6、扩展思考
maven中的约定优于配置
7、参考文献
www.baidu.com
8、更多讨论
聚合项目的反应堆及其裁剪
用了 Maven 好几年了,许多人还是只懂得简单的依赖坐标。对于 Maven 的聚合和继承还是一知半解,甚至很多人以为是同一个东西。但其实聚合是用于快速构建项目,是表示项目与子项目之间的关系。而继承则是为消除重复的配置。下面通过一个例子深入聊聊这两者的关系。
欢迎工作一到五年的Java工程师朋友们加入Java程序员开发: 854393687
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
聚合
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 这样可以被子类继承的元素还有下面几个元素:
groupIdversiondescriptionorganizationinceptionYearurldeveloperscontributorsdistributionManagementissueManagementciManagementscmmailingListspropertiesdependenciesdependencyManagementrepositoriesbuildreporting聚合与继承的关系
从上面可以看到多模块 Maven 项目中的聚合与继承其实是两个概念,其目的是完全不同的。聚合是为了方便快速构建项目,继承是为了消除重复配置。
对于聚合模块来说,它知道哪些被聚合的模块(通过modules元素),但那些被聚合的模块不知道这个聚合模块的存在。
对于继承关系的父 POM 来说,它不知道哪些子模块继承于它,但那些子模块都必须知道自己的父 POM 是什么。
在实际项目中,大家会发现一个 pom 即是聚合 pom,又是父 pom,这么做主要是为了方便。就像上面我们定义的聚合模块为 taobao-aggregator,父级模块为 taobao-parent,我们可以将其合并成为一个名为 taobao 的 pom 文件。这样清晰明了。
欢迎工作一到五年的Java工程师朋友们加入Java程序员开发: 854393687
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
发表评论