1.将一个项目划分成多个模块
聚合特性能够把各个模块聚合在一起创建。一次构件多个子模块。
继承特性能帮助抽取各模块相同的依赖和插件等配置,简化pom,促进各模块配置的一致性。
2配置
groupId:一个项目的子模块都应使用同样的groupId
artifactId:应该使用一致的前缀
version:如果一起开发和发布,还应该使用同样的version
(1)聚合项目pom.xml(用于聚合)
<packaging>pom</packaging>//聚合项目的打包方式packaging的值必须是pom
在打包方式为pom的maven项目中声明module元素(父模块,子模块),module的值是一个当前pom的相对目录
聚合模块里包含子模块结构:
<modules>
<module>xx</module>
<module>xx</module>
</modules>
平行目录结构:
<modules>
<module>../xx</module>
<module>../xx</module>
</modules>
(2)父模块pom.xml(用于继承)
用于消除配置的重复。
<packaging>pom</packaging>//聚合项目的打包方式packaging的值必须是pom
(3)子模块pom.xml
继承父模块
<parent>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<relativePath></relativePath>
</parent>
当构建项目时,maven会首先根据relativePath检查父pom,如果找不到,再从本地仓库查找。relativePath的默认值是../pom.xml,即父pom在上一层目录下。
正确设置relativePath非常重要,当开发团队的新成员从源码库签出一个包含父子模块关系的maven项目,由于只关心其中的某一个子模块,它就直接到该模块的目录下执行创建,此时,父模块是没有被安装到本地仓库的,因此如果子模块没有设置正确的relativePath,maven将无法找到父pom,将直接导致构建失败。
子模块不声明groupId和version,会隐式从父模块继承,如果需要使用与父模块不一样的groupId和version,可以在子模块中显式声明。
(4)可继承的pom元素(部分)
groupId,version
description:项目描述信息
organization:项目的组织信息
inceptionYear:项目的创始年份
url:项目的url地址
developers:项目的开发者信息
contributers:贡献者信息
distributionManagement:项目的部署配置
properties:自定义的maven属性
dependencies:项目的依赖配置
dependencyManagement:项目的依赖管理配置
repositories:项目的仓库配置
build:包括项目的源码目录配置,输出目录配置,插件配置,插件管理配置等
(5)依赖管理
父模块的依赖配置,一部分子模块需要继承,另一部分不需要继承。
这种情况使用<dependencyManagement>。
父模块
<properties>
<springframework.version>2.5.6</springframework.version>
<junit.version>4.7</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
这里使用的 dependencyManagement声明的依赖既不会给父模块引入依赖,也不会给子模块引入依赖,不过这段配置是会被继承的。
子模块
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
子模块只需要配置groupId和artifactId就能引入父模块配置的依赖。
使用 dependencyManagement能统一项目范围中依赖的版本,不会发生多个子模块使用依赖版本不一致的情况。这可以帮助降低依赖冲突的几率。
使用import范围依赖导入依赖管理配置:
<dependency>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
<type>pom</type>
<scope>import</scope>
</dependency>
依赖的type值为pom,import范围依赖由于其特殊性, 一般都是指向打包类型为pom的模块。
(6)插件管理pluginManagement
用法与dependencyManagement类似
3小结
maven的聚合与继承是两个概念。聚合是为了方便快速构建项目,继承是为了消除重复配置。
对于聚合模块,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。
对于继承关系的父pom,它不知道有哪些子模块继承于它,但那些子模块都必须知道自己的父pom是什么。
共同点:聚合pom与继承关系中的父pom的packaging都必须是pom;聚合模块和继承关系中的父模块除了pom之外都没有实际的内容。
在实际项目中,往往融合聚合和继承,一个pom既是聚合pom又是父pom。
4超级pom
任何一个maven项目都隐式继承该pom。maven3,超级pom在文件$MAVEN_HOME/lib/maven-model-builder-x.x.x.jar中的org/apache/maven/model/pom-4.0.0.xml路径下。
(1)超级pom关于仓库的定义
定义仓库和插件仓库的地址为:http://repo1.maven.org/maven2,并且都关闭了SNAPSHOT的支持。
(2)项目结构
(3)插件版本
(4)项目报告输出目录
(5)项目发布的profile
5反应堆
(1)反应堆的构建順序
maven按序读取pom,如果该pom没有依赖模块,那么就构建该模块,否则就先构建其依赖模块,如果该依赖还依赖于其他模块,则进一步先构建依赖的依赖。
(2)剪裁反应堆
一般情况,用户会选择构建整个项目或选择构建单个模块,但有些时候,用户会想要仅仅构建完整反应堆的某些个模块。
maven提供命令行支持剪裁反应堆,输入mvn-h可以看到这些选项:
-am 同时构建所列模块的依赖模块
-amd 同时构建依赖于所列模块的模块
-pl 构建指定的模块,模块间用逗号分隔
-rf 从指定的模块回复反应堆