Maven的聚合与继承

(尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/83867717冷血之心的博客)

关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~

快速导航:

Maven基础概念和安装配置教程

Maven的仓库和settings.xml配置文件

Maven的坐标与依赖

Maven的生命周期和插件

Maven的聚合与继承

目录

聚合

继承

聚合和继承的关系

反应堆

裁剪反应堆

总结


         在上边的学习中,我们介绍了Maven是一种强大的构建工具,能够帮助我们自动下载构件,并且通过给每一个构件确定其坐标,实现了构件在仓库中的存储。正是Maven的生命周期和插件的互相绑定才使得我们可以非常愉快的完成项目的构建。在实际的项目中,我们往往会建立多个模块(module)。我们在本文中要介绍的聚合和继承就特别适合多个模块的协同工作。   

Maven的聚合特性可以帮助我们把项目的多个模块聚合在一起,使用一条命令进行构建,即一条命令实现构建多个项目;

Maven的继承特性可以将各个模块相同的依赖和插件配置提取出来,在简化POM的同时还可以促进各个模块配置的一致性。

聚合

      我们在一个项目中会存在模块A和模块B,在各自的项目目录下,我们可以分别通过命令 mvn clean package 来构建各个模块,但是如果我们想将这两个模块一起构建呢?

       答案是我们需要建立一个模块C做为一个聚合模块。

如下图(两个图一起看)所示:

从图中可以看出,passport是各个passport-xx的聚合模块,聚合模块也是一个模块,所以同样会有POM文件,其重要的的pom配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<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.baidu</groupId>
    <artifactId>company</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    
    <modules>
        <module>company-agent</module>
        <module>company-java-core</module>
        <module>company-https</module>
        <module>company-http</module>
        <module>company-management</module>
        <module>company-security</module>
        <module>company-login</module>
        <module>company-sns</module>
        <module>company-mt</module>
        <module>company-message-scribe2mysql-storm</module>
        <module>company-activator</module>
        <module>company-activator-api</module>
        <module>company-recard</module>
        <module>company-zk-replicator</module>
        <module>company-app-auth</module>
        <module>company-app-auth-https</module>
        <module>company-app-auth-applier</module>
        <module>company-user-rights</module>
        <module>company-idc</module>
    </modules>
</project>

在配置中(此处将passport和company互换了下,为了不泄露公司数据,希望大家可以看懂即可),我们需要注意以下的标签:

<packaging>pom</packaging>

在前面的学习中,我们见过打包方式为jar和war的,但是聚合模块的打包方式必须为pom,否则无法完成构建

在company聚合模块的目录下,我们执行 mvn clean package,结果如下:

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] company
[INFO] company-swift-common
[INFO] company-db-aio-common
[INFO] company-agent
[INFO] company-security
[INFO] company-captcha
[INFO] company-core
[INFO] company-sns
[INFO] company-request-check
[INFO] company-captcha-voice
[INFO] company-https
[INFO] company-http
[INFO] company-management
[INFO] company app auth https
[INFO] company-app-auth-applier
[INFO] company-user-rights
[INFO] company-idc
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building company 0.0.1-SNAPSHOT

可以看到maven给根据各个模块之间的依赖关系,给我们计算好了构建次序(也叫反应堆),接下来将会依次构建各个模块,实现了一条命令构建多个模块。

 

继承

        继承和聚合有相似的地方,继承的特性是指建立一个父模块,我们项目中的多个模块都做为该模块的子模块,将各个子模块相同的依赖和插件配置提取出来,从而简化配置文件,父模块的打包方式必须为pom,否则无法构建项目。父模块和聚合模块经常可以做到合二为一。

        通过在各个子模块中配置来表明其继承与哪一个父模块:

<parent>
        <groupId>com.baidu</groupId>
        <artifactId>miliao-rootpom</artifactId> 
        <version>2.0.3</version>
</parent>

可继承的POM元素如下

  • groupId:项目组ID,项目坐标的核心元素
  • version:项目版本,项目坐标的核心因素
  • description:项目的描述信息
  • organization:项目的组织信息
  • inceptionYear:项目的创始年份
  • url:项目的URL地址
  • developers:项目的开发者信息
  • contributors:项目的贡献者信息
  • distributionManagement:项目的部署配置
  • issueManagement:项目的缺陷跟踪系统信息
  • ciManagement:项目的持续集成系统信息
  • scm:项目的版本控制系统
  • malilingLists:项目的邮件列表信息
  • properties:自定义的Maven属性
  • dependencies:项目的依赖配置
  • dependencyManagement:项目的依赖管理配置
  • repositories:项目的仓库配置
  • build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置
  • reporting:包括项目的报告输出目录配置、报告插件配置等

聚合和继承的关系

       虽然聚合模块和父模块经常合二为一,但是聚合和继承是两个不同的概念,其实是没有什么关系的。

聚合模块知道它聚合了哪些模块,但是被聚合的模块不知道聚合模块的存在;

父模块不知道子模块的存在,但是子模块都必须知道自己的父模块是谁。

可以用下图来表示这两个不同的概念:

 

反应堆

        在一个拥有多个模块的Maven项目中,反应堆(Reactor)是指所有模块组成的一个构建结构。对于单个模块的项目来说反应堆就是该模块本身,但是对于多模块的项目来说,反应堆就包含了各个模块之间的继承与依赖的关系,最后再根据各个模块在pom中声明的先后顺序,自动计算出合理的模块构建顺序。

在company聚合模块的目录下,我们执行 mvn clean package,在结果的前面就显示了构建顺序(反应堆)

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] company
[INFO] company-swift-common
[INFO] company-db-aio-common
[INFO] company-agent
[INFO] company-security
[INFO] company-captcha
[INFO] company-core
[INFO] company-sns
[INFO] company-request-check
[INFO] company-captcha-voice
[INFO] company-https
[INFO] company-http
[INFO] company-management
[INFO] company app auth https
[INFO] company-app-auth-applier
[INFO] company-user-rights
[INFO] company-idc
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building company 0.0.1-SNAPSHOT

裁剪反应堆

      我们可以通过如下的命令来裁剪反应堆:

比如,我们可以在聚合模块的路径下执行:

  • mvn clean package -pl commpany-test,company-agent   表示我们指定要构建这两个模块。
  • mvn clean package -pl commpany-test  -am 表示我们要构建commpany-test,同时要构建该模块依赖的其余模块。

        这个裁剪反应堆还是很有作用的,比如我们有一个模块company-A,在该模块中我们依赖company-B模块并且version为0.0.2,如果我们单独构建company-A,那么将会从maven仓库(本地+远程)中去下载version为0.0.2的company-B,若该模块不存在,构建过程将报错。假如我们使用了 -am 参数,那么即使仓库中不存在version为0.0.2的company-B, maven将会自动从当前项目中打包构建version为0.0.2的company-B前提是company-B的pom配置中version为0.0.2,这样company-A的构建过程将不会出错。

 

总结

      通过本文的介绍,我们学习了Maven的聚合与继承特性,可以更加方便的管理和构建项目了。到此,通过五节课的学习,我们基本完成了Maven的常见知识点的介绍与学习,学会这些基本可以让我们在日常的工作中愉快构建项目了。接下来便是更加高深的Maven用法了,有兴趣的同学可以和博主一起学习。

 

如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~

本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。

关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温柔狠角色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值