`
leonzhx
  • 浏览: 769409 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

第八章 聚合与继承

阅读更多

1.   为了能用一条命令来构建一个实际项目下的多个模块,而不是到两个模块目录下分别执行 mvn 命令, Maven 提供了聚合(或者称为多模块)的特性。我们可以额外建一个聚合用的模块,它仅有一个 pom.xml 文件,没有别的目录和文件。在它的 pom.xml packaging 必须为 POM ,并且多了一个 <modules> 元素。在 <modules> 中每一个 <module> 声明一个实际项目中的一个模块。这里的值不是模块的 artifactId ,而是模块目录相对于当前 POM 所在目录的相对路径。一般会将聚合模块放在项目目录的最顶层,其他功能模块作为聚合模块的子目录存在,子目录取名与功能模块的 artifactId 一致。比如:

<groupId>com.juvenxu.mvnbook.account</groupId>  
  
<artifactId>account-aggregator</artifactId>  
  
<version>1.0.0-SNAPSHOT</version>  
  
<packaging>pom</packaging>  
  
<name>Account Aggregator</name>  
  
<modules>  
  
  <module>account-email</module>  
  
  <module>account-persist</module>  
  
</modules>
 

对应的目录结构为

 


 

2.   我们可以为项目的所有功能模块创建一个父模块,然后在父 POM 中声明一些配置供子 POM 继承,以实现“一处声明,多处使用的目的”。父模块只有一个 pom.xml 文件,没有别的目录和文件。 pom.xml 中的 packaging 值必须为 POM 。在子 POM 中需要声明父模块:

 

<parent>

  <groupId>com.juvenxu.mvnbook.account</groupId>

  <artifactId>account-parent</artifactId>

  <version>1.0.0-SNAPSHOT</version>

  <relativePath>../account-parent/pom.xml</relativePath>

</parent> 
 

元素 relativePath 声明了父 POM 的相对路径,默认值是 ../pom.xml 。同样还需要把父模块也加入到聚合模块中。

 

3.   可继承的 POM 元素有:

1)  groupId

2)  version

3)  description ( 没有 artifactId name)

4)  organization

5)  inceptionYear ( 项目创始年份 )

6)  url

7)  developers

8)  contributors

9)  distributionManagement

10)  issueManagement (项目的缺陷跟踪系统信息)

11)  ciManagement (项目的持续集成系统信息)

12)  scm (项目的版本控制系统的信息)

13)  mailingLists

14)  properties

15)  dependencies

16)  dependencyManagment

17)  repositories

18)  build (包括项目的源码目录、输出目录、插件配置、插件管理配置等)

19)  reporting (包括项目的报告输出目录配置、报告插件配置等)

 

4.   虽然 depedencies 是可以被继承的,但如果所有的子模块都必须继承父模块的所有 dependencies 显然是不合理的, Maven 在父 POM 中提供了 dependencyManagement 元素,能让子 POM 有选择地继承依赖。父模块的 dependencyManagement 元素中用 dependencies 元素声明的依赖,可以被子 POM 有选择地继承,方法是在子 POM dependencies 元素中也声明该依赖,并且只需要声明 goupId artifactId 即可,当然也可以声明别的属性来覆盖父 POM 中的声明。如果子模块不声明依赖的使用,那在 POM dependencyManagement 中声明的依赖不会产生任何效果。

 

5.   import 范围的依赖只有在 dependencyManagement 中声明才有效果,使用该范围的依赖通常指向另一个 POM ,作用是将目标 POM 中的 dependencyManagement 配置导入并合并到当前 POM dependencyManagement 配置中。如:

 

<dependencyManagement>

  <dependencies>

    <dependency>

    <groupId>com.juvenxu.mvnbook.account</groupId>

        <artifactId>account-parent</artifactId>

       <version>1.0-SNAPSHOT</version

      <type>pom</type>

      <scope>import</scope>

    </dependency>

  </dependencies>

</dependencyMangement> 











 

注意,上述代码中 type 值必须为 pom 。如果有多个实际项目,它们使用的依赖版本都是一致的,则可以定义一个专门管理共用依赖的 POM ,然后在各个实际项目中导入这个 POM dependencyManagment

 

6.   Maven 也提供了 pluginManagement 元素帮助管理插件。在该元素中配置的依赖不会造成实际的插件调用行为,当 POM 中配置了真正的 plugin 元素,并且其 groupId artifactId pluginManagement 中配置的插件匹配时, pluginManagment 的配置才会影响实际的插件行为。

 

7.   当项目中的多个模块有同样的插件配置时,应当将配置移到父 POM pluginManagement 元素中。即使各个模块对于同一插件的具体配置不尽相同,也应当使用父 POM pluginManagement 元素统一声明插件的版本。这样可以统一项目使用的插件版本。

 

8.   一个 POM 可以既是聚合 POM ,又是父 POM 。我们一般为了方便可以这么做。(子 POM relativePath 的默认值本就指向 ../pom.xml

 

9.   在使用 Maven 的过程中我们应该注意:约定优于配置。任何一个 Maven 项目都隐式地继承自超级 POM ,对于 Maven 3 而言,超级 POM lib/maven-model-builder-x.x.x.jar 中的 org/apache/maven/model/pom-4.0.0.xml 下,对于 Maven 2 而言,超级 POM lib/maven-x.x.x-uber.jar 中的 org/apache/maven/project/pom-4.0.0.xml 下。这里 x.x.x 表示 Maven 的具体版本号。

 

10.   在一个多模块的 Maven 项目中, Reactor 是指所有模块组成的一个构建结构。对于单模块的项目, Reactor 就是该模块本身。而对多模块项目来说, Reactor 就包含了各模块之间继承与依赖的关系,从而能够自动计算出合理的模块构建顺序。

 

11.   实际的多模块构建顺序是这样形成的: Maven 按序读取 POM (聚合模块本身就是第一个 POM ),如果该 POM 没有依赖模块,那么就构建该模块,否则就先构建其依赖模块,如果该依赖模块还依赖其他模块,则进一步构建依赖的依赖。

 

12.   Maven 命令提供如下选项,实时裁剪 Reactor

-am, --also-make 同时构建 -pl 参数中所列模块的依赖模块

-amd, --also-make-dependents 同时构建依赖于 -pl 参数中所列模块的模块

-pl, --projects <arg> 构建指定的模块,模块间用逗号分隔。

-rf, --resume-from <arg> Reactor 中指定的模块开始构建,至 Reactor 结束。

  • 大小: 3.1 MB
分享到:
评论

相关推荐

    Maven实战(高清版)

    背景案例第5章 坐标和依赖第6章 仓库第7章 生命周期和插件第8章 聚合与继承第9章 使用nexus创建私服第10章 使用maven进行测试第11章 使用hudson进行持续集成第12章 使用maven构建web应用第13章 版本管理第...

    maven window下安装包

    第8章:聚合和继承/8.4 聚合与继承的关系 第8章:聚合和继承/8.5 约定优于配置 第8章:聚合和继承/8.6 反应堆/8.6.1 反应堆的构建顺序 第8章:聚合和继承/8.6 反应堆/8.6.2 剪切反应堆 第9章:使用Nexus创建私服/9.2...

    A面向对象分析与设计(UML.2.0版)

    目录 ...第8章 设计系统体系结构 第9章 选择技术 第10章 设计子系统 第11章 可重用的设计模式 第12章 指定类的接口 第13章 不间断的测试 附录A Ripple小结 附录B iCoot案例分析 附录C UML表示法小结

    ASPNET35开发大全第一章

    第8章 Web窗体的数据控件 8.1 数据源控件 8.1.1 SQL数据源控件(SqlDataSource) 8.1.2 Access数据源控件(AccessDataSource) 8.1.3 目标数据源控件(ObjectDataSource) 8.1.4 LINQ数据源控件(LinqDataSource) ...

    面向对象系统分析与设计课件及复习资料

    第8章 活动图 8.1 概述 8. 2 活动图的基本元素 8.2.1 动作状态与活动状态 8.2.2 动作流 8.2.3 泳道 8.2.4 对象流 8. 3 活动分解 8.4 并发 8.4.1 并发与同步 8.4.2 条件线程 8.4.3 同步...

    UML与系统分析设计

    第8章 活动图 8.1 概述 8. 2 活动图的基本元素 8.2.1 动作状态与活动状态 8.2.2 动作流 8.2.3 泳道 8.2.4 对象流 8. 3 活动分解 8.4 并发 8.4.1 并发与同步 8.4.2 条件线程 8.4.3 同步...

    Entity Framework 6 Recipes(中文word翻译版)

    第8部分 实体数据建模基础之继承关系映射TPT 第9部分 实体数据建模基础之继承关系映射TPH 第10部分 实体数据建模基础之两实体间Is-a和Has-a关系建模、嵌入值映射 第11部分 查询之异步查询 第12部分 查询之使用SQL...

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    策略19.1 何为策略模式19.2 何时使用策略模式19.3 在UITextField中应用验证策略19.4 总结第20章 命令20.1 何为命令模式20.2 何时使用命令模式20.3 在Cocoa Touch框架中使用命令模式20.3.1 NSInvocation对象20.3.2 ...

    类和类之间的依赖、关联、聚合、组合关系

    抽象原则有两方面的意义:第一,尽管问题域中的事物是很复杂的,但是分析员并不需要了解和描述它们的一切,只需要分析研究其中与系统目标有关的事物及其本质性特征。第二,通过舍弃个体事物在细节上的差异,抽取其...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    第8章 理解值和引用 135 8.1 复制值类型的变量和类 135 8.2 理解null值和可空类型 139 8.2.1 使用可空类型 140 8.2.2 理解可为空类型的属性 141 8.3 使用ref和out参数 142 8.3.1 创建ref参数 142 8.3.2 创建...

    Java语言基础下载

    第八章:异常 122 学习目标 122 异常的概念 123 异常的分类 123 实例分析 124 自定义异常 126 方法覆盖和异常 127 内容总结 129 第九章:基于文本的应用 131 学习目标 131 程序交互的几种方式 132 常用类方法说明 ...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     第8章 IO库 277  8.1 IO类 278  8.1.1 IO对象无拷贝或赋值 279  8.1.2 条件状态 279  8.1.3 管理输出缓冲 281  8.2 文件输入输出 283  8.2.1 使用文件流对象 284  8.2.2 文件模式 286  8.3 string流 287 ...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     第8章 IO库 277  8.1 IO类 278  8.1.1 IO对象无拷贝或赋值 279  8.1.2 条件状态 279  8.1.3 管理输出缓冲 281  8.2 文件输入输出 283  8.2.1 使用文件流对象 284  8.2.2 文件模式 286  8.3 string流 287 ...

    UML和模式应用(架构师必备).part01.rar

    第8章 迭代1—基础 8.1 迭代1的需求和重点:OOA/D技术的核心 8.2 过程:初始和细化 8.3 过程:计划下一个迭代 第9章 领域模型 9.1 示例 9.2 什么是领域模型 9.3 动机:为什么要创建领域模型 9.4 准则:如何...

    UML和模式应用(架构师必备).part02.rar

    第8章 迭代1—基础 8.1 迭代1的需求和重点:OOA/D技术的核心 8.2 过程:初始和细化 8.3 过程:计划下一个迭代 第9章 领域模型 9.1 示例 9.2 什么是领域模型 9.3 动机:为什么要创建领域模型 9.4 准则:如何...

    写给大忙人看的JAVA SE 8

    第8章杂项改进 166 8.1 字符串 168 8.2 数字类 168 8.3 新的数学函数 169 8.4 集合 170 8.4.1 集合类中添加的方法 170 8.4.2 比较器 171 8.4.3 Collections类 173 8.5 使用文件 173 8.5.1 读取文件行的流 173 8.5.2 ...

    scala从入门到精通技术教学视频

    第八章 特质 00.导学 01.类继承单个特质 02.类继承多个特质 03.单例对象继承特质 04.演示trait中的成员 05.动态混入trait 06.使用trait实现适配器设计模式 07.使用trait实现模板方法模式 08.使用trait实现...

    UML和模式应用(架构师必备).part07.rar

    第8章 迭代1—基础 8.1 迭代1的需求和重点:OOA/D技术的核心 8.2 过程:初始和细化 8.3 过程:计划下一个迭代 第9章 领域模型 9.1 示例 9.2 什么是领域模型 9.3 动机:为什么要创建领域模型 9.4 准则:如何...

Global site tag (gtag.js) - Google Analytics