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

时间:2023-01-02 18:19:51

1、Maven的聚合

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

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

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

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

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

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

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

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文件中

新建好的结构如下:

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

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

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

然后查看user-dao模块中的jar包

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

上图中,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&period;x搭建私服以及Maven多模块项目创建

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

  5. Maven入门-4&period;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&period;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. IE对象最后一个属性后不要加逗号,否则在IE7及以下版本中会报错

    某函数返回一个对象,如果在最后一个属性后加逗号,IE7及以下版本中会报错 正确代码: return{ top:rect.top-top, bottom:rect.bottom-top, left:re ...

  2. IOS 日志输出控制

    用以下内容可以控制在debug版本中打印日志,而在release版本中不打印 #ifdef DEBUG# define DBLog(format,...) NSLog((@"[%s][%s] ...

  3. 使用AF&lowbar;INET实现点对点的通信示例

    作者:Younger Liu,本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. 1.    客户端(发送方) 操作流如下: (1) 使用AF_INET协议簇, ...

  4. 让你的Javascript提升70&percnt;性能

    现在的JavaScript代码要进行性能优化,通常使用一些常规手段,如:延迟执行.预处理.setTimeout等异步方式避免处理主线程,高大上一点的会使用WebWorker.即使对于WebWorker ...

  5. R语言︱函数使用技巧(循环、if族&sol;for、switch、repeat、ifelse、stopifnot)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 后续加更内容: 应用一:if族有哪些成员呢?- ...

  6. 实战深度学习OpenCV&lpar;三&rpar;:视频实时canny边缘检测

    #include <stdio.h> #include"opencv2/opencv.hpp" using namespace cv; int main() { Vid ...

  7. win10 安装php

    缺失:msvcp110.dll https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=30679

  8. centos下tomcat启动卡死

    遇到好几次了,总是忘记哪个位置~!!! tomcat启动时查看日志会卡在一个位置很长时间,如下 28-Aug-2018 22:56:55.216 INFO [localhost-startStop-1 ...

  9. mysql 开发基础系列3

    日期类型 如果要用来表示年月日,通常用DATE 来表示. 如果要用来表示年月日时分秒,通常用DATETIME 表示. 如果只用来表示时分秒,通常用TIME 来表示. TIMESTAMP表示格式 :YY ...

  10. curl命令(测试连接命令)

    curl命令是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具.作为一款强力工具,curl支持包括HTTP.HTTPS.f ...