Maven入门-5.Maven的聚合和继承
1、Maven的聚合
在Maven入门-4.Maven的依赖中,我们创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,模块会越来越多,就不能每一个都编译测试了,这时Maven给出了聚合的配置方式。
所谓聚合,顾名思义,就是把多个模块或项目聚合到一起
现在新建一个专门负责聚合工作的Maven project(user-aggregator)
新建好之后的项目是如下状态:
这时我们可以把里面的所有内容都删掉,只保留pom.xml即可。

1.1 聚合的配置
在pom.xml中使用modules来聚合其它模块。
user-aggregator的pom.xml文件内容如下:
<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.fz.user</groupId><artifactId>user-aggregator</artifactId><version>0.0.1-SNAPSHOT</version><!--这里的打包方式需要为pom--><packaging>pom</packaging><modules><module>../user-core</module><module>../user-dao</module><module>../user-log</module><module>../user-service</module></modules></project>
聚合完成后就可以使用clean test 等命令来统一编译聚合进来的几个模块了,它的好处就是在一个项目中把其他项目都一次编译了。。
2、Maven的继承
在刚才的项目中,有很多重复的配置,有相同的groupId和version,有相同的log4j、juit等等的依赖,Maven中可以声明一个父POM供子POM继承。
可以把父pom理解为Java中的一个父类,然后pom.xml中的一些groupId,version,相同的依赖之类的都可以理解味Java父类的一些共有属性。子POM继承了该父POM,就继承了这些属性(groupId,version,相同的依赖)
2.1 可被继承的POM元素
groupId:项目组ID,项目坐标的核心元素version: 项目版本, 项目坐标的核心元素description: 项目的描述信息organization: 项目的组织信息inceptionYear: 项目的创始年份url: 项目的URL地址developers: 项目开发者信息contributors: 项目的贡献者信息distributionManagement: 项目的部署配置issueManagement: 项目的缺陷跟踪系统信息ciManagement: 项目的持续集成系统信息scm: 项目的[版本控制](http://lib.csdn.net/base/git "Git知识库")系统信息mailingLists: 项目的邮件列表信息properties: 自定义的maven属性dependencies: 项目的依赖配置dependencyManagement: 项目的依赖管理配置repositories: 项目的仓库配置build: 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等reporting: 包括项目的报告输出目录配置、报告插件配置等
下面开始
新建一个父POM项目(user-parent),用于管理子POM中重复的”属性”。同样也是删除掉src/java/main等无用的目录。只留下pom.xml即可。
也可以把聚合的配置也放到该继承pom.xml文件中
新建好的结构如下:
user-parent中的pom.xml文件内容如下:
<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.fz.user</groupId><artifactId>user-parent</artifactId><version>0.0.1-SNAPSHOT</version><!--这里的打包方式需要为pom--><packaging>pom</packaging><modules><module>../user-core</module><module>../user-dao</module><module>../user-log</module><module>../user-service</module></modules></project>
2.2 POM中使用继承
user-core模块的pom.xml文件最初始内容如下
<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.fz.user</groupId><artifactId>user-core</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>user-core</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId><version>1.3</version></dependency></dependencies></project>
这里我们可以把以下内容添加到user-parent的pom.xml中,让子POM来继承。
<groupId>com.fz.user</groupId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
修改user-parent模块中的pom.xml,内容如下:
<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.fz.user</groupId><artifactId>user-parent</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!--properties中可以自定义属性--><junit.version>4.10</junit.version><log4j.version>1.2.17</log4j.version><hamcrest.version>1.3</hamcrest.version></properties><modules><module>../user-core</module><module>../user-dao</module><module>../user-log</module><module>../user-service</module></modules></project>
然后在user-core模块中使用parent元素来实现继承,修改后的pom.xml如下:
<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><!-- 使用parent元素来实现继承 --><parent><groupId>com.fz.user</groupId><artifactId>user-parent</artifactId><version>0.0.1-SNAPSHOT</version><!-- 这里要加上relativePath来指定user-parent的pom.xml文件的绝对路径 --><relativePath>../user-parent/pom.xml</relativePath></parent><artifactId>user-core</artifactId><name>user-core</name><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><!--这里使用自定义属性 --><version>${junit.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><!--这里使用自定义属性 --><version>${log4j.version}</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId><!--这里使用自定义属性 --><version>${hamcrest.version}</version></dependency></dependencies></project>
2.3 继承dependency
除了普通属性可以被继承,dependency也可以被继承下来。我们把user-core中的dependency放到user-parent中。
dependency的继承需要用dependencyManagement来管理。如果不使用dependencyManagement,每一个子POM都会把父POM中的dependency继承下来。也就是说,每个子模块中都会有全部的jar包,这肯定是不行的
下面可以把user-core,user-log,user-dao,user-service几个模块中的所有dependency都加到user-parent中,然后在各个子POM中使用该dependency即可。
修改后的user-parent的pom.xml文件内容如下:
<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.fz.user</groupId><artifactId>user-parent</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!--properties中可以自定义属性--><junit.version>4.10</junit.version><log4j.version>1.2.17</log4j.version><hamcrest.version>1.3</hamcrest.version></properties><!-- 继承中需要使用dependencyManagement来管理依赖 --><dependencyManagement><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><!--这里使用自定义属性--><version>${junit.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><!--这里使用自定义属性--><version>${log4j.version}</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId><!--这里使用自定义属性--><version>${hamcrest.version}</version></dependency><dependency><groupId>com.fz.user</groupId><artifactId>user-core</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.fz.user</groupId><artifactId>user-dao</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.fz.user</groupId><artifactId>user-log</artifactId><version>0.0.1-SNAPSHOT</version><exclusions><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions></dependency></dependencies></dependencyManagement><modules><module>../user-core</module><module>../user-dao</module><module>../user-log</module><module>../user-service</module></modules></project>
然后在user-core,user-log,user-dao,user-service几个模块中继承这些依赖。这里以user-core为例,user-core的pom.xml文件内容如下:
<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><!-- 使用parent元素来实现继承 --><parent><groupId>com.fz.user</groupId><artifactId>user-parent</artifactId><version>0.0.1-SNAPSHOT</version><!-- 这里要加上relativePath来指定user-parent的pom.xml文件的绝对路径 --><relativePath>../user-parent/pom.xml</relativePath></parent><artifactId>user-core</artifactId><name>user-core</name><!-- 子POM继承父POM的dependency时需要什么依赖就添加什么依赖就行了但是要去掉version。只保留groupId和artifactId即可--><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId></dependency></dependencies></project>
这样一来,每个模块中就只会引用到自己定义的dependency中的依赖了。
例子:
现在想加入mysql的jar包,但是这个jar包只会在user-dao中使用,其他模块中不会用到。可以在user-parent和user-dao中分别增加一条dependency
然后查看user-dao模块中的jar包
上图中,user-log和user-core中没有mysql的依赖,由于user-service依赖了user-dao,所以也同样会有mysql-connector-java的依赖。
Maven入门-5.Maven的聚合和继承的更多相关文章
- Maven学习(五)-- 聚合与继承
标签(空格分隔): 学习笔记 Maven的聚合特性能够把项目的各个模块聚合在一起构建: Maven的继承特性能够帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能够促进各个模块配置的一致性 ...
- 《Maven实战》笔记-5-pom聚合和继承
一.聚合 假设有两个模块:account-email和account-persist: 能够使用一条命令就能构建上述两个模块,需要创建一个额外的模块:account-aggregator: 通过acc ...
- maven 学习笔记--仓库,聚合和继承,私服搭建
仓库 http://blog.csdn.net/wanghantong/article/details/36427433 聚合和继承 http://www.cnblogs.com/xdp-gacl/p ...
- Maven入门,Maven项目的创建,nexus 2.x搭建私服以及Maven多模块项目创建
maven的了解做一个总结,以便日后查阅, 若有不足之处,还望指出,学无止境 当然也能起到入门效果. 一,搭建maven私服 1.工具 a. Nexus 2.5.1-01 b. Maven 3.3.9 ...
- Maven入门-4.Maven的依赖
1.Maven的依赖1.1 添加依赖1.2 依赖范围(sope)依赖范围与classpath的关系1.3 依赖的传递性1.2.1 依赖传递性的冲突问题1. 第一种情况2. 第二种情况1.2.2 通过e ...
- Maven 入门——认识 Maven
Maven /ˈmāvən/ ,可以翻译成"专家",是一款来自 Apache 组织的开源项目,用于项目管理.主要服务于基于 Java 平台的项目构建.依赖管理和项目信息管理. 构建 ...
- Maven入门-2.Maven一些核心概念介绍
1.Maven仓库2.Maven坐标3.Maven插件和目标4.Maven生命周期4.1 clean:清理项目4.2 default:构建项目(重要)4.3 site:建立项目站点 1.Maven仓库 ...
- Maven入门:Maven的基本概念
本文转自:http://www.tianmaying.com/tutorial/maven-basic 看这篇文章之前,你应该先Run起来一个简单的Maven项目,先有个感性认识,然后再来听听对这些基 ...
- Maven 入门——认识Maven结构
1.settings.xml 元素解读 localRepository 该元素表示本地 Maven 仓库的地址,不设置的话,默认为 ~/.m2/repository pluginGroups 将插件的 ...
随机推荐
- POJ 2823 Sliding Window(单调队列 || 线段树)题解
题意:求每个长度为k的数组的最大值和最小值 思路: 1.用线段树创建维护最大值和最小值,遍历询问,简单复习了一下...有点手生 2.单调队列: 可以看一下详解 单调队列顾名思义就是一个单调递增或者递减 ...
- hdu 6444 Neko's loop 单调队列优化DP
Neko's loop Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- 发现 一个 http 压测库
代码库:https://github.com/wg/wrk 安装 https://github.com/wg/wrk
- Quartz.NET教程:(01) 使用Quartz
使用调度器 (scheduler) 之前要先用 ISchedulerFactory 的一个实现来实例化调度器(scheduler).一旦调度器实例化完成,则它可以被启动.置于备用模式或者关闭.需要注意 ...
- Jmeter高阶学习,运用NotePad++编写工程,随意复制多个工程到同一个工程
Jmeter创建了工程之后,保存文件后就是一个jmx后缀的文件,你有没有试过单独用文本编辑器打开文件,编辑文件? Step1: 最简单的Jmeter工程,只有一个测试计划 <?xml versi ...
- [库][c++]tinyxml2使用小结
参考:http://blog.csdn.net/educast/article/details/12908455 1.配置TinyXML2 去这里把项目弄下来,然后解压,我们之需要里面的tinyxml ...
- 《剑指offer》第三十二题(之字形打印二叉树)
// 面试题32(三):之字形打印二叉树 // 题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺 // 序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印, / ...
- android开发:Android 中自定义属性(attr.xml,TypedArray)的使用
今天我们的教程是根据前面一节扩展进行的,如果你没有看,请点击 Android高手进阶教程(三)查看第三课,这样跟容易方便你的理解! 在xml 文件里定义控件的属性,我们已经习惯了android:att ...
- CentOS Redhat Linux安装 Oracle Client 的注意点
1) 安装文件要拷贝到本地文件系统执行 2) 虽然不知道 libXmu是什么,但是安装之后,关联包安装了许多,感觉很省心 yum install libXmu.i686 3) 还有找不到的包的话,用 ...
- WPF如何给窗口Window增加阴影效果
https://blog.csdn.net/w_sx12553/article/details/45072861