Maven实战读书笔记(五):聚合与继承

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

5.1 聚合

Maven聚合也称多模块,能够一次构建多个模块。聚合模块本身是一个Maven项目,所以也有自己的POM文件,该POM文件的packagingpom,并且含有<modules><module>元素,如:

<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.wangdh</groupId>
   <artifactId>springboot.demo</artifactId>
   <version>1.0.0-SNAPSHOT</version>
   <packaging>pom</packaging>
   <modules>
     <module>springboot-mybatis</module>
     <module>springboot-web</module>
     <module>springboot-quickstart</module>
   </modules>
</project>

这里每个module的值都是一个当前POM的相对目录,一般而言,为了方便快速定位内容,模块所处的目录名称应该与其artifactId一致,不过这不是Maven的要求。

因此,聚合模块与其他模块的目录结构并非一定要父子关系,通过修改module的值,也能更改为平级关系:

<module>../springboot-quickstart</module>

Maven首先会解析聚合模块的POM,分析要构建的模块,并计算出一个反应堆构建顺序,然后根据这个顺序依次构建各个模块。反应堆包含了模块之间继承和依赖的关系。模块间的依赖关系会将反应堆构成一个有向非循环图。

5.2 继承

继承解决的是对重复依赖和插件配置的抽取。通过定义一个父模块,将其他模块相同的配置抽离到父模块中,然后继承父模块,并且父模块也是一个Maven项目,其POM文件的packagingpom

子模块需要增加<parent>元素配置:

<parent>
   <artifactId>springboot.demo</artifactId>
   <groupId>com.wangdh</groupId>
   <version>1.0.0-SNAPSHOT</version>
  <relativePath>../pom.xml</relativePath>
</parent>

relativePath定义了父模块POM文件的位置。默认值为../pom.xmlMaven默认父POM在上一层目录下。

POM文件可被继承的元素有:

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

5.3 聚合与继承比较

对于Maven聚合,聚合模块知道他聚合了哪些模块,但是被聚合模块不知道它自己被谁聚合了;

对于Maven继承,子模块知道自己的父模块是谁,但父模块不知道自己有多少子模块。

在实际使用过程中聚合模块和父模块是同一个模块。

5.4 依赖管理

子模块继承父模块时,也会继承父模块的依赖配置,假设添加一个util的子模块,该模块只提供一些简单的帮助工具,与springframework完全无关,难道也让它依赖spring-corespring-beansspring-context么?这显然是不合理的。

Maven提供的dependencyManagement元素既能让子模块继承父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下声明的依赖不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。

在父POM使用dependencyManagement声明的依赖能够统一项目范围中依赖的版本,在子模块使用依赖的时候就不需要版本了,只需要简单的配置groupIdartifactId就能获得对应的依赖信息,从而引进正确的依赖。

如果子模块不声明依赖的使用,即使该依赖已经在父POMdependencyManagement中声明了,也不会产生实际的效果。

如,在父POM定义如下dependencyManagement

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.14.RELEASE</version>
      </dependency>
    </dependencies>
</dependencyManagement>

在子模块使用时,只需要:

 <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
 </dependency>

对于子模块而言,可以按需添加依赖,对于整个项目而言,可以规范对依赖的版本号管理。

原文地址:https://www.cnblogs.com/Jxwz/p/8372376.html

时间: 2024-10-12 13:02:31

Maven实战读书笔记(五):聚合与继承的相关文章

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

一.聚合 假设有两个模块:account-email和account-persist: 能够使用一条命令就能构建上述两个模块,需要创建一个额外的模块:account-aggregator: 通过account-aggregator构建整个项目的所有模块,而该模块本身也是Maven项目,有自己的Pom文件: 注意聚合模块account-aggregator打包方式packaging的值必须为pom,如下: 注意,聚合模块与其他模块的目录结构一般是父子关系,如上述pom所示.不过也不是必须的,这是要

Maven实战读书笔记(8)

何为Maven的生命周期? 1.Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完善的.易扩展的生命周期 2.这个生命周期包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有的构建步骤 3.Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,实际的任务(如编译源代码)都是交由插件来完成的 Maven的这种思想与设计模式的模板方法非常相似 模板方法模式在父类中定义算法的整体结构,子类可以通过实现或者重写父类的方法来控制实际的行为,这样

maven实战读书笔记(1)

Maven这个词的中文翻译是? 可以翻译为"知识的积累",也可以翻译为"专家"或"内行" Maven是啥?干什么的? 1.一个跨平台的项目管理工具 2.Apache组织的一个颇为成功的开源项目 3.Maven主要服务于基于Java平台的项目构建.依赖管理和项目信息管理 4.适合小型的开源类项目.大型的企业级应用 5.适合传统的瀑布式开发.流行的敏捷模式开发 跨平台是指?Maven是跨平台的 无论是Windows.Linux或者Mac上,都可以使用

Maven实战读书笔记(6)

Maven的坐标和依赖是?构件的逻辑表示方式和物理表示方式是? 1.坐标和依赖是任何一个构件在Maven世界中的逻辑表示方式 2.文件是Maven构件的物理表示方式 3.Maven通过仓库来统一管理这些文件 那么,构件是什么东东? 1.任何一个依赖.插件或者项目构建的输出,都可以称为构件 2.依赖log4j-1.2.15.jar是一个构件 3.插件maven-compiler-plugin-2.0.2.jar是一个构件 4.account-email项目构建完成后输出account-email-

R语言实战读书笔记(五)高级数据管理

5.2.1 数据函数 abs: sqrt: ceiling:求不小于x的最小整数 floor:求不大于x的最大整数 trunc:向0的方向截取x中的整数部分 round:将x舍入为指定位的小数 signif:舍入为指定的有效数字位数 cos,sin,tan acos,asin,atan:反正弦,反余弦,反正切 cosh,sinh,tanh:双曲余弦,双曲正弦和双曲正切 acosh,asinh,atanh:反双曲余弦,反双曲正弦和反双曲正切 log(x,n):以n为底 log: log10: ex

Maven实战读书笔记(15)

关于灵活的构建 一个优秀的构建系统必须足够灵活,它应该能够让项目在不同的环境下都能成功地构建. 例如,典型的项目都会有开发环境.测试环境和产品环境,这些环境的数据库配置不尽相同,那么项目构建的时候就需要能够识别所在的环境并使用正确的配置 还有一种常见的情况是,项目开发了大量的集成测试,这些测试运行起来非常耗时,不适合在每次构建项目的时候都运行,因此需要一种手段能让我们在特定的时候才激活这些集成测试,Maven为了支持构建的灵活性,内置了三大特性,即属性.Profile和资源过滤 Maven属性

Maven实战读书笔记(3)

POM是什么? 1.像Make的Makefile.Ant的build.xml一样,Maven项目的核心是pom.xml 2.POM (Project Object Model, 项目对象模型) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等 如何编写一个Hello World的POM? 新建一个名为pom.xml的文件,输入内容如下: <?xml version="1.0" encoding="UTF-8"?> <project xm

Maven实战读书笔记(13)

WAR 1.基于Java的Web应用,其标准的打包方式是WAR 2.WAR与JAR类似,不过它包含更多的内容,如JSP文件.Servlet.Java类.web.xml配置文件.依赖JAR包.静态web资源(如HTML.CSS.JavaScript文件)等 一个典型的WAR文件的目录结构 - war / + META-INF / + WEB-INF / | + classes / | | + ServletA.class | | + config.properties | | + ... | |

Maven实战读书笔记(14)

什么是版本管理? 版本管理是指项目整体版本的演变过程管理,如从1.0-SNAPSHOT到1.0再到1.1-SNAPSHOT 什么是版本控制? 版本控制是指借助版本控制工具(如Subversion)追踪代码的每一个变更 什么时候可以将快照版本更新为发布版本 1.所有自动化测试应当全部通过 2.项目没有配置任何快照版本的依赖 3.项目没有配置任何快照版本的插件 4.项目所包含的代码已经全部提交到版本控制系统中 Maven的版本号定义约束 可能有个版本号是这样的,1.3.4-beta-2 Maven的