1、Maven的聚合

在Maven入门-4.Maven的依赖中,我们创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,模块会越来越多,就不能每一个都编译测试了,这时Maven给出了聚合的配置方式。

所谓聚合,顾名思义,就是把多个模块或项目聚合到一起

现在新建一个专门负责聚合工作的Maven project(user-aggregator)

新建好之后的项目是如下状态:



这时我们可以把里面的所有内容都删掉,只保留pom.xml即可。

1.1 聚合的配置

在pom.xml中使用modules来聚合其它模块。

user-aggregator的pom.xml文件内容如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.fz.user</groupId>
  5. <artifactId>user-aggregator</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <!--这里的打包方式需要为pom-->
  8. <packaging>pom</packaging>
  9. <modules>
  10. <module>../user-core</module>
  11. <module>../user-dao</module>
  12. <module>../user-log</module>
  13. <module>../user-service</module>
  14. </modules>
  15. </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元素

  1. groupId:项目组ID,项目坐标的核心元素
  2. version: 项目版本, 项目坐标的核心元素
  3. description: 项目的描述信息
  4. organization: 项目的组织信息
  5. inceptionYear: 项目的创始年份
  6. url: 项目的URL地址
  7. developers: 项目开发者信息
  8. contributors: 项目的贡献者信息
  9. distributionManagement: 项目的部署配置
  10. issueManagement: 项目的缺陷跟踪系统信息
  11. ciManagement: 项目的持续集成系统信息
  12. scm: 项目的[版本控制](http://lib.csdn.net/base/git "Git知识库")系统信息
  13. mailingLists: 项目的邮件列表信息
  14. properties: 自定义的maven属性
  15. dependencies: 项目的依赖配置
  16. dependencyManagement: 项目的依赖管理配置
  17. repositories: 项目的仓库配置
  18. build: 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
  19. reporting: 包括项目的报告输出目录配置、报告插件配置等

下面开始

新建一个父POM项目(user-parent),用于管理子POM中重复的”属性”。同样也是删除掉src/java/main等无用的目录。只留下pom.xml即可。

也可以把聚合的配置也放到该继承pom.xml文件中

新建好的结构如下:



user-parent中的pom.xml文件内容如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.fz.user</groupId>
  5. <artifactId>user-parent</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <!--这里的打包方式需要为pom-->
  8. <packaging>pom</packaging>
  9. <modules>
  10. <module>../user-core</module>
  11. <module>../user-dao</module>
  12. <module>../user-log</module>
  13. <module>../user-service</module>
  14. </modules>
  15. </project>

2.2 POM中使用继承

user-core模块的pom.xml文件最初始内容如下

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.fz.user</groupId>
  5. <artifactId>user-core</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>jar</packaging>
  8. <name>user-core</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12. </properties>
  13. <dependencies>
  14. <dependency>
  15. <groupId>junit</groupId>
  16. <artifactId>junit</artifactId>
  17. <version>4.10</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>log4j</groupId>
  21. <artifactId>log4j</artifactId>
  22. <version>1.2.17</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.hamcrest</groupId>
  26. <artifactId>hamcrest-core</artifactId>
  27. <version>1.3</version>
  28. </dependency>
  29. </dependencies>
  30. </project>

这里我们可以把以下内容添加到user-parent的pom.xml中,让子POM来继承。

  1. <groupId>com.fz.user</groupId>
  2. <version>0.0.1-SNAPSHOT</version>
  3. <packaging>jar</packaging>
  4. <url>http://maven.apache.org</url>
  5. <properties>
  6. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  7. </properties>

修改user-parent模块中的pom.xml,内容如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.fz.user</groupId>
  5. <artifactId>user-parent</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>pom</packaging>
  8. <url>http://maven.apache.org</url>
  9. <properties>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. <!--properties中可以自定义属性-->
  12. <junit.version>4.10</junit.version>
  13. <log4j.version>1.2.17</log4j.version>
  14. <hamcrest.version>1.3</hamcrest.version>
  15. </properties>
  16. <modules>
  17. <module>../user-core</module>
  18. <module>../user-dao</module>
  19. <module>../user-log</module>
  20. <module>../user-service</module>
  21. </modules>
  22. </project>

然后在user-core模块中使用parent元素来实现继承,修改后的pom.xml如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <!-- 使用parent元素来实现继承 -->
  5. <parent>
  6. <groupId>com.fz.user</groupId>
  7. <artifactId>user-parent</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <!-- 这里要加上relativePath来指定user-parent的pom.xml文件的绝对路径 -->
  10. <relativePath>../user-parent/pom.xml</relativePath>
  11. </parent>
  12. <artifactId>user-core</artifactId>
  13. <name>user-core</name>
  14. <dependencies>
  15. <dependency>
  16. <groupId>junit</groupId>
  17. <artifactId>junit</artifactId>
  18. <!--这里使用自定义属性 -->
  19. <version>${junit.version}</version>
  20. </dependency>
  21. <dependency>
  22. <groupId>log4j</groupId>
  23. <artifactId>log4j</artifactId>
  24. <!--这里使用自定义属性 -->
  25. <version>${log4j.version}</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.hamcrest</groupId>
  29. <artifactId>hamcrest-core</artifactId>
  30. <!--这里使用自定义属性 -->
  31. <version>${hamcrest.version}</version>
  32. </dependency>
  33. </dependencies>
  34. </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文件内容如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.fz.user</groupId>
  5. <artifactId>user-parent</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>pom</packaging>
  8. <url>http://maven.apache.org</url>
  9. <properties>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. <!--properties中可以自定义属性-->
  12. <junit.version>4.10</junit.version>
  13. <log4j.version>1.2.17</log4j.version>
  14. <hamcrest.version>1.3</hamcrest.version>
  15. </properties>
  16. <!-- 继承中需要使用dependencyManagement来管理依赖 -->
  17. <dependencyManagement>
  18. <dependencies>
  19. <dependency>
  20. <groupId>junit</groupId>
  21. <artifactId>junit</artifactId>
  22. <!--这里使用自定义属性-->
  23. <version>${junit.version}</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>log4j</groupId>
  27. <artifactId>log4j</artifactId>
  28. <!--这里使用自定义属性-->
  29. <version>${log4j.version}</version>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.hamcrest</groupId>
  33. <artifactId>hamcrest-core</artifactId>
  34. <!--这里使用自定义属性-->
  35. <version>${hamcrest.version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>com.fz.user</groupId>
  39. <artifactId>user-core</artifactId>
  40. <version>0.0.1-SNAPSHOT</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>com.fz.user</groupId>
  44. <artifactId>user-dao</artifactId>
  45. <version>0.0.1-SNAPSHOT</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>com.fz.user</groupId>
  49. <artifactId>user-log</artifactId>
  50. <version>0.0.1-SNAPSHOT</version>
  51. <exclusions>
  52. <exclusion>
  53. <groupId>log4j</groupId>
  54. <artifactId>log4j</artifactId>
  55. </exclusion>
  56. </exclusions>
  57. </dependency>
  58. </dependencies>
  59. </dependencyManagement>
  60. <modules>
  61. <module>../user-core</module>
  62. <module>../user-dao</module>
  63. <module>../user-log</module>
  64. <module>../user-service</module>
  65. </modules>
  66. </project>

然后在user-core,user-log,user-dao,user-service几个模块中继承这些依赖。这里以user-core为例,user-core的pom.xml文件内容如下:

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <!-- 使用parent元素来实现继承 -->
  5. <parent>
  6. <groupId>com.fz.user</groupId>
  7. <artifactId>user-parent</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <!-- 这里要加上relativePath来指定user-parent的pom.xml文件的绝对路径 -->
  10. <relativePath>../user-parent/pom.xml</relativePath>
  11. </parent>
  12. <artifactId>user-core</artifactId>
  13. <name>user-core</name>
  14. <!-- 子POM继承父POM的dependency时需要什么依赖就添加什么依赖就行了
  15. 但是要去掉version。只保留groupId和artifactId即可
  16. -->
  17. <dependencies>
  18. <dependency>
  19. <groupId>junit</groupId>
  20. <artifactId>junit</artifactId>
  21. </dependency>
  22. <dependency>
  23. <groupId>log4j</groupId>
  24. <artifactId>log4j</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.hamcrest</groupId>
  28. <artifactId>hamcrest-core</artifactId>
  29. </dependency>
  30. </dependencies>
  31. </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的聚合和继承的更多相关文章

  1. Maven学习(五)-- 聚合与继承

    标签(空格分隔): 学习笔记 Maven的聚合特性能够把项目的各个模块聚合在一起构建: Maven的继承特性能够帮助抽取各模块相同的依赖和插件等配置,在简化POM的同时,还能够促进各个模块配置的一致性 ...

  2. 《Maven实战》笔记-5-pom聚合和继承

    一.聚合 假设有两个模块:account-email和account-persist: 能够使用一条命令就能构建上述两个模块,需要创建一个额外的模块:account-aggregator: 通过acc ...

  3. maven 学习笔记--仓库,聚合和继承,私服搭建

    仓库 http://blog.csdn.net/wanghantong/article/details/36427433 聚合和继承 http://www.cnblogs.com/xdp-gacl/p ...

  4. Maven入门,Maven项目的创建,nexus 2.x搭建私服以及Maven多模块项目创建

    maven的了解做一个总结,以便日后查阅, 若有不足之处,还望指出,学无止境 当然也能起到入门效果. 一,搭建maven私服 1.工具 a. Nexus 2.5.1-01 b. Maven 3.3.9 ...

  5. Maven入门-4.Maven的依赖

    1.Maven的依赖1.1 添加依赖1.2 依赖范围(sope)依赖范围与classpath的关系1.3 依赖的传递性1.2.1 依赖传递性的冲突问题1. 第一种情况2. 第二种情况1.2.2 通过e ...

  6. Maven 入门——认识 Maven

    Maven /ˈmāvən/ ,可以翻译成"专家",是一款来自 Apache 组织的开源项目,用于项目管理.主要服务于基于 Java 平台的项目构建.依赖管理和项目信息管理. 构建 ...

  7. Maven入门-2.Maven一些核心概念介绍

    1.Maven仓库2.Maven坐标3.Maven插件和目标4.Maven生命周期4.1 clean:清理项目4.2 default:构建项目(重要)4.3 site:建立项目站点 1.Maven仓库 ...

  8. Maven入门:Maven的基本概念

    本文转自:http://www.tianmaying.com/tutorial/maven-basic 看这篇文章之前,你应该先Run起来一个简单的Maven项目,先有个感性认识,然后再来听听对这些基 ...

  9. Maven 入门——认识Maven结构

    1.settings.xml 元素解读 localRepository 该元素表示本地 Maven 仓库的地址,不设置的话,默认为 ~/.m2/repository pluginGroups 将插件的 ...

随机推荐

  1. 全面理解虚拟DOM,实现虚拟DOM

    1.为什么需要虚拟DOM DOM是很慢的,其元素非常庞大,页面的性能问题鲜有由JS引起的,大部分都是由DOM操作引起的.如果对前端工作进行抽象的话,主要就是维护状态和更新视图:而更新视图和维护状态都需 ...

  2. (转)Nuts and Bolts of Applying Deep Learning

    Kevin Zakka's Blog About Nuts and Bolts of Applying Deep Learning Sep 26, 2016 This weekend was very ...

  3. HDU 4587 TWO NODES(割两个点的最大连通分支数)

    http://acm.hdu.edu.cn/showproblem.php?pid=4587 题意: 给一图,求割去两个点后所能形成的最大连通分支数. 思路: 对于这种情况,第一个只能枚举,然后在删除 ...

  4. Python CSV Reader/Writer 例子--转载

    CSV(comma-separated values) 是跨多种形式导入导出数据的标准格式,比如 MySQL.Excel. 它以纯文本存储数和文本.文件的每一行就代表一条数据,每条记录包含了由逗号分隔 ...

  5. 转载:oracle 11g ADG实施手册(亲测,已成功部署多次)

    https://www.cnblogs.com/yhfssp/p/7815078.html 一:实验环境介绍 虚拟机系统: RHEL Linux 6.4(64位) 数据库版本: Oracle 11gR ...

  6. windows服务部署

    1.新建windows服务项目 2.编辑业务代码 我这里只写2句记录文本的测试代码 using System; using System.IO; using System.ServiceProcess ...

  7. django查询集API

    本节将详细介绍查询集的API,它建立在下面的模型基础上,与上一节的模型相同: from django.db import models class Blog(models.Model): name = ...

  8. Qt5.3.2_CentOS6.4(x86)_代码文件编码

    1.1.1.Qt5.3.2_MinGW 在Windows中安装时,默认的文件编码是 UTF8. 1.2.在 CentOS6.4中安装 qt-opensource-linux-x86-5.3.2.run ...

  9. Python - openpyxl 读写操作Excel

    openpyxl特点   openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间转换容易 注意:如果文字编码是“gb2312” 读取后就会显 ...

  10. Python 错误与异常

    2017-08-01 13:40:17 在程序运行过程中,总会遇到各种各样的错误. 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复 ...