Maven的聚合特性能够把项目的各个模块聚合在一起构件,而Maven的继承特性能够帮助抽取各个模块相同的依赖和插件等配置,简化POM的同时,还能促进各个模块配置的一致性。

    1.聚合
    为了能使用一条命令构建两个模块A,B,需要创建一个新的模块G,然后通过模块构建整个项目的所有模块。G本身就是一个Maven项目,它必须有自己的POM,不过同时作为一个聚合项目,POM的packaging必须是pom。如下,否则无法构建。
    <packaging>pom</packaging>
    <modules>
        <module>modelA</module>
        <module>modelB</module>
    </modules>
    </modules>:实现聚合的最核心配置。用户可以通过在一个打包方式为pom的Maven项目中声明任意数量的module元素来实现模块的聚合。
    一般情况,模块所处的目录名称应该与其artifactId一直。不过不是硬性要求。推荐这么做。
    如何构建:Maven首先解析聚合模块的名称,不是artifactId,这是为何要在pom中配置合理的name字段。目的更好的清晰输出。
    2.继承
    2.1 父POM
    可以使用继承解决重复的配置。
    可以创建一个父模块。有一个pom文件,与其他模块使用相同的groupId和version。使用artifactId为parent表示父模块。
    其他模块使用继承。
    
    groupId、artifactId和version指定父模块的坐标。是必须的,relativePath表示父模块POM的相应路径。Maven首先从relativePath检查父POM,如果找不到则从本地仓库查找。默认值是 . ./pom.xml 。就是说,Maven默认父POM在上一层目录下。
    正确设置relativePath非常重要:如果父模块没有安装到本地仓库,relativePath路径存在问题,则找不到父POM,导致构件失败。如果根据relativePath找到父pom,它就不需要再检查本地仓库。
    groupId和version也可以继承。artifactId需要自己显示声明,否则会出现坐标冲突。
    2.2可继承的POM元素
    
    
    2.3 依赖管理
    当A,B继承W,当将A,B模块的所有依赖都写在W中的时候,现在添加C模块,但是C模块并不依赖某些构件。怎么办?
    Maven提供的dependencyManagement元素,能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下依赖声明不会引入实际的依赖,不过它能约束dependencies下的依赖使用。
    例子:
    父POM配置:
    
    子POM配置:
    
    子POM中的依赖配置较原来简单了一些,所有的配置值配置了groupId和artifactId。省去了version。还可以省略范围(scope标签)。
    使用这种依赖管理机制似乎不能减少太多pom配置。但是建议使用,原因:父POM使用dependencyManagement声明依赖能够统一项目范围中的依赖版本,减少多个子模块版本依赖不一致情况,降低依赖冲突。
    如果子模块不声明依赖的使用,不会产生任何实际效果。
    scope的import属性:导入依赖范围;只对dependencyManagement元素下才有效果,使用该范围的依赖通常指向一个POM,作用是将目标POM中的dependencyManagement配置导入到当前POM的dependencyManagement元素中。
    例子:
    
    注意:type为pom,import一般都指向打包类型为pom的模板,如果多个项目,它们使用的依赖版本都是一致的,可以定义一个dependencyManagement专门管理,各个项目导入这些依赖管理配置。
    2.4 插件管理
    使用pluginManagement元素管理插件。也不会造成实际的插件调用行为,当POM中配置了真正的plugin元素,并且其groupId和artifactId与pluginManagement中的配置的插件配置匹配时,pluginManagement的配置才会有实际插件行为。
3、聚合与继承的关系
    聚合:为了方便快捷构件项目;对于聚合模块来说,它知道哪些被聚合的模块,被聚合的模块不知道这个聚合模块的存在。
    继承:主要为了清除重复配置。父POM不知道哪些子模块,子模块知道父模块。
    相同点:POM的packaging必须是pom。聚合模块与继承关系中的父模块除了POM之外没有实际的内容。在实际项目中,一个pom及时聚合pom又是父pom。
4、约定优于配置
    不多说,使用工具和框架都知道!!!
5、反应堆
    反应堆(Reactor):所有模块组成一个构建结构。从而自动计算出合理的构件顺序。
    5.1 反应堆顺序
    Maven按序读取POM,如果POM没有依赖模块,那就构件该模块,否则先构建其依赖块,如果依赖块还依赖其他模块,则进一步先构建依赖的依赖。如果出现循环则Maven报错。
    5.2 裁剪反应堆
    如果用户仅仅构建反应堆中的某些个模块。
    Maven提供很多的命令行选项支持裁剪反应堆。
    
    例子:
    
    
    
    
    
 
 
 
 
 
 
 
    

6 Maven聚合与集成的更多相关文章

  1. 笔记:Maven 聚合和继承

    聚合模块 我们希望一次构建两个或更多项目,而不是到每个模块的目录下分别执行mvn命令,Maven 聚合这一特性就是为该需求服务的, 为了使用聚合,我们必须创建一个聚合模块,通过该模块与其他项目聚合,并 ...

  2. 06 Maven 聚合和继承

    Maven 聚合和继承 1. 聚合 2. 继承 <parent> <groupId>org.apache.karaf.demos</groupId> <art ...

  3. maven聚合(依赖聚合)

    maven聚合工程 原文地址:http://juvenshun.iteye.com/blog/305865 http://blog.csdn.NET/woxueliuyun/article/detai ...

  4. 学习一下 SpringCloud (一)-- 从单体架构到微服务架构、代码拆分(maven 聚合)

    一.架构演变 1.系统架构.集群.分布式系统 简单理解 (1)什么是系统架构? [什么是系统架构?] 系统架构 描述了 在应用程序内部,如何根据 业务.技术.灵活性.可扩展性.可维护性 等因素,将系统 ...

  5. (十四)Maven聚合与继承

    1.Maven聚合 我们在平时的开发中,项目往往会被划分为好几个模块,比如common公共模块.system系统模块.log日志模块.reports统计模块.monitor监控模块等等.这时我们肯定会 ...

  6. 学习笔记——Maven实战(四)基于Maven的持续集成实践

    Martin的<持续集成> 相信很多读者和我一样,最早接触到持续集成的概念是来自Martin的著名文章<持续集成>,该文最早发布于2000年9月,之后在2006年进行了一次修订 ...

  7. maven,spring,mybatis集成错误

    maven,spring,mybatis集成的时候单元测试junit测试没问题,但mvn jetty:run 就报错误 错误: org.apache.ibatis.binding.BindingExc ...

  8. Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例

    Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例 转自:通过注解的方式集成Spring 4 MVC+Hibernate 4+MySQL+Maven,开发项目样例 ...

  9. idea下创建maven聚合(子父级)项目,多模块项目

    IDEA下Maven多模块项目介绍和搭建 idea 创建maven聚合项目简洁教程(手把手入门,通俗易懂) 本人使用的是: intelj idea 创建聚合项目(典型web项目,包括子项目util.d ...

随机推荐

  1. LeetCode OJ——Pascal's Triangle II

    http://oj.leetcode.com/problems/pascals-triangle-ii/ 杨辉三角2,比杨辉三角要求的空间上限制Could you optimize your algo ...

  2. kd树的构造与搜索

    学习了两篇博客,存下来以免丢失. http://blog.csdn.net/losteng/article/details/50893739 https://leileiluoluo.com/post ...

  3. tomcat启动报异常(一)

    异常问题:Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web ...

  4. docker 如何清理垃圾呢

    应用容器在宿主机上长期运行,应用实例启停容器,会产生大量的停止的容器,无容器使用的数据卷.网络配置,无容器依赖的镜像,这些垃圾日积月累,会影响到宿主机的运行状态,造成机子卡顿等现象.因此,需要对这些宿 ...

  5. 【linux】CentOS编译程序报错 修复 ./Modules/_ssl.c:64:25: 致命错误:openssl/rsa.h:没有那个文件或目录

    如果你在编译时遇到这个错误,这可能是下面的原因:你尝试编译的程序使用OpenSSL,但是需要和OpenSSL链接的文件(库和头文件)在你Linux平台上缺少. 所以在CentOS下, 退到根路径,[需 ...

  6. 45个非常有用的Oracle查询语句(转自开源中国社区)

    日期/时间 相关查询 获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天.你可以用任何的日期值替换 “SYSDATE”来指定查询的日期. SELECT TRUNC (SYSDATE, 'MO ...

  7. 前端模板inspinia

    前端模板,可以下个免费的,可以花点小钱买.或者github搜索一个 https://chuibility.github.io/inspinia/ http://cn.inspinia.cn/layou ...

  8. mysql数据库连接状态,不要做修改数据库表结构的操作;数据库迁移操作;

    在开发过程中,python的flask框架使用sqlalmysql连接mysql数据库. 在程序连接数据量过程中,不要修改数据表的结构.比如在连接状态中使用下面的软件修改数据表结构,这个软件立即就会卡 ...

  9. C#对象实例化

    C#常用的对象实例化有以下几种方式: using System; using System.Collections.Generic; using System.Linq; using System.R ...

  10. ffmpeg 跟我学 视频教程

    最近一段时间找时间录制了一些Ffmpeg视频教程,还有录制完毕,会持续更新,内容会包含Ffmeg保存文件,网络流转发, 编码,解码,播放器制作,以及服务端搭建等等,适合初学者,有需要的朋友的可以关注: ...