您的位置:首页 > 其它

Maven实战 第8章聚合与继承

2015-10-29 13:43 302 查看

第8章 聚合与继承

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

8.1.1 account-persist的POM

8.1.2 account-persist的主代码

8.2 聚合

一次构建两个项目,Maven聚合(或者称为多模块)这一特性就是为该需求服务的。
为了能够使用一条命令就能构建account-email和account-persist两个模块,需要创建一个额外的名为account-aggregator的模块,然后通过该模块构建整个项目的所有模块。
account-aggregator的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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>
<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-parent</module>
</modules>
</project>
packaging的值为POM,对于聚合模块来说,其打包方式packaging的值必须为pom,否则就无法构建。
可以通过在一个打包方式为pom的Maven项目中声明任意数量的module元素来实现模块的聚合。
在account-aggregator下运行mvn clear install,得到如下结果:



Maven会首先解析聚合模块的POM、分析要构建的模块、并计算出一个反应堆构建顺序,然后根据这个顺序依次构建各个模块。反应堆是所有模块组成的一个构建结构。

8.3 继承

在Maven的世界中,也有类似的机制能让我们抽取出重复的配置,这就是POM的继承。

8.3.1 account parent

在account-aggregator下创建一个名为account-parent的子目录,然后在该子目录下建立一个所有除account-aggregator之外模块的父模块。
account-parent的POM
<pre name="code" class="html"><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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook.account</groupId>
<artifactId>account-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Account Parent</name>
</project>


修改account-email继承account-parent
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion>

<parent>
<groupId>com.juvenxu.mvnbook.account</groupId>
<artifactId>account-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../account-parent/pom.xml</relativePath>
</parent>

<artifactId>account-email</artifactId>
<name>Account Email</name>

<dependencies>
...
</dependencies>

<build>
<plugins>
...
</plugins>
</build>


使用POM中使用parent元素声明父模块,元素relativePath表示父模块POM的相对路径。
更新过的POM从父模块继承了groupId和version。

8.3.2 可继承的POM元素

1)groupId:项目组ID,项目坐标的核心元素
2)version:项目版本,项目坐标的核心元素
3)description:项目的描述信息
4)organization:项目的组织信息
5)inceptionYear:项目的创始年份
6)url:项目的URL地址
7)developers:项目的开发者信息
8)contributors:项目的贡献值信息
9)distributionManagement:项目的部署配置
10)issueManagement:项目的缺陷跟踪系统信息
11)ciManagement:项目的持续集成系统信息
12)scm:项目的版本控制系统信息
13)mailingLists:项目的邮件列表信息
14)properties:自定义的Maven属性
15)dependencies:项目的依赖配置
16)dependencyManagement:项目的依赖管理配置
17)repositories:项目的仓库配置
18)build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等。
19)reporting:包括项目的报告输出目录配置、报告插件配置等。

8.3.3 依赖管理

Maven提供的dependencyManagement元素既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。在dependencyManagement元素下的依赖声明不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。
在account-parent中配置dependencyManagement元素
*依赖范围为import。
该依赖范围只在dependencyManagement元素下才有效果,使用该范围的依赖通常指向一个POM,作用是将目标POM中的dependencyManagement配置导入并合并到当前POM的dependency元素中。
使用import范围依赖导入依赖管理配置
<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>
</dependencyManagement>

8.3.4 插件管理

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

8.4 聚合与继承的关系

聚合是为了方便快速构建项目,继承是为了消除重复配置。
在实际项目中,聚合和继承往往融合使用,一个项目即是聚合POM,又是父POM。

8.5 约定优于配置

任何一个Maven项目都隐式地继承自该POM,因此,大量超级POM的配置都会被所有Maven项目继承,这些配置也就成为了Maven所提倡的约定。

8.6 反应堆

反应堆是指所有模块组成的一个构建结构,包含了各模块之间继承与依赖的关系,从而能够自动计算出合理的模块构建顺序。

8.6.1 反应堆的构件顺序

8.6.2 剪裁反应堆

Maven提供很多的命令行选项支持剪裁反应堆,输入mvn -h可以看到这些选项。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: