`

06 聚合和继承

阅读更多

一、Maven多模块
      当我们一个项目有多个模块时,我们想使用一个命令即可对多个模块进行构建。Maven聚合就是为了满足该需求的。
      假设我们有两个模块A和B。想使用一个命令就构建A和B两个模块,我们需要创建一个额外的名为C的模块,然后通过该模块构建整个项目的所有模块。作为一个模块,它必须有自己的POM文件,但作为一个聚合项目,它的POM又有其特殊地方。如:

<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.test</groupId>
  <artifactId>C</artifactId>
  <packaging>pom</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <modules>
  	<module>A</module>
  	<module>B</module>
  </modules>
</project>

      上述POM文件有两个特殊的地方:一是打包类型必须为pom,二是有modules元素。
      通常为了方便用户构建项目,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录。如果使用平行目录,则聚合模块的POM要作出相应修改:

<modules>
	<module>../A</module>
	<module>../B</module>
</modules>

      以此可看出,module中的内容是其他模块所在目录,而不是模块名称。

 

 

二、继承
1.父模块和子模块
      一个项目的多个模块往往会有大量重复的配置。在面向对象编程中,程序员可通过继承一定程度上减少代码重复。Maven中也有类似的继承机制。
父模块的POM只有一个特殊的地方就是打包类型必须为pom。将各种子模块中共同配置放到该父模块中。然后由其他模块来继承:

<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>
  <parent>
    <artifactId>A</artifactId>
    <groupId>com.test</groupId>
    <version>0.0.1-SNAPSHOT</version>
	<relativePath>./pom.xml</relativePath>
  </parent>
  <artifactId>A</artifactId>
</project>

     上述POM文件中parent指明了父模块。relativePath元素指明了父模块pom.xml文件位置。默认值是目前模块的上层目录。子模块可以不指定groupId和artifactId。

 

2.可继承的POM元素
     大多数元素都可被继承(是否意味着有些元素不能被继承??)

 

3.依赖管理
      子模块会继承父模块的依赖,但是并不是所有子模块都需要父模块中的所有依赖,此时可使用 dependencyManagement 元素,在dependencyManagement中声明的依赖不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。子模块只要指定依赖的groupId和artifactId即使显示指定该依赖。

 

4.插件管理
      pluginManagement和dependencyManagement类似,用来管理插件。

 

三、聚合和继承的关系
      两者的目的不同,聚合是为了方便构建,继承是为了消除重复配置。
对于聚合模块来说,它需要知道哪些被模块被聚合,但那些被聚合的模块不知道这个聚合模块的存在。
      对于继承关系的父模块来说,它不知道有哪些子模块继承于它,但那些子模块才都必须知道自己的父模块。
      现实中,通常将一个打包类型为pom的模块即作聚合模块,又作父模块。

四、反应堆


1.概述
      所有反应堆是一个多模块项目中,所有模块组成的一个构建结构。根据各个模块之间的依赖关系,Maven会自动生成反应堆,要注意不能让两个模块互相依赖。


2.裁剪反应堆
      一般来说,用户会选择构建整个项目或者模块某个模块,但有些时间,用户会想仅仅构建某些模块,而不所有模块。
-am   --also-make 同时构建所列模块的依赖模块
-amd --also-make-dependents 同时构建依于所列模块的模块
-pl    --projeccts <arg> 构建指定的模块,模块间用逗号分隔
-rf    --resume-fron <arg> 从指定的模块开始构建,反应堆之前的模块不被构建。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics