maven中聚合和继承是两个概念,两者的目的是不一样的。聚合是为了方便的快速构建项目,而继承是为了消除一些重复的配置。
对于聚合模块来说,它知道有哪些模块被聚合了,但是那些被聚合的模块并不知道这个聚合模块的存在。
对于继承关系的父pom来说,它不知道哪些被聚合的模块,但那些被聚合的模块必须知道自己的父pom是什么。
聚合
开发中,一个项目一般被分为多个模块,通过maven的聚合特性,我们可以创建一个父maven项目来管理所有的子模块。
现有account-email和account-persist两个maven项目,我们创建一个account-parent项目将其聚合在一起。
聚合有两种结构方式:
1.父子结构:
2.平行结构
下面例子以平行结构为例。
account-parent配置如下:
1 | <groupId>com.juvenxu.mvnbook.account</groupId> |
modules元素用于聚合子模块,packaging元素声明其打包方式为pom。对于一个聚合子模块的父模块,其打包方式必须为pom。对于平行结构来说,父模块的内容仅为一个pom文件。
对父模块执行 mvn clean install
命令:
1 | [INFO] ------------------------------------------------------------------------ |
继承
如果需要继承父模块pom中的一些配置,我们只需要在子模块pom中添加如下配置
1 | <parent> |
通过parent元素指定其父模块,relativePath指向父模块的pom路径,其默认值为../pom.xml。
父模块pom中声明的一些元素可以被子模块继承,常用的有:
■ groupId
:项目id,项目坐标的核心元素
■ version
:项目版本,项目坐标的核心元素
■ description
:项目的描述信息
■ organization
:项目的组织信息
■ distributionManagement
:项目的部署信息
■ properties
:自定义的maven属性
■ dependencies
:依赖
■ dependencyManagement
:依赖管理配置
■ repositories
:项目的仓库配置
■ build
:项目的源码目录配置,输出目录配置,插件配置,插件管理配置等
依赖继承
对于子模块共用的依赖,可以统一在父模块中声明,比如在父模块account-parent中配置dependencyManagement:
1 | <properties> |
子模块使用这些依赖的时候,只需要简单的配置,如account-email的pom配置:
1 | <properties> |
可发现,account-email的dependencies配置省去了version,对于junit还省去了scope。省去这些信息是因为account-email继承了父模块的dependencyManagement配置,完整的依赖声明已经包含在父pom中,子模块只需要声明简单的groupId和artifactId就可以找到对应的依赖。
注意:虽然完整的依赖已经包含在父模块pom中了,但并不是说子模块完全不需要声明依赖了。比如子模块不声明spring-context-support依赖,那么该依赖不会被引入。
插件继承
在父模块account-parent的pom中配置pluginManagement元素:
1 | <build> |
子模块需要用到这些插件的时候,只需要简单的配置:
1 | <build> |
只需要在子模块中指定插件的groupId和artifactId就可以在父模块pom中找到对应的插件配置。
《Maven实战》读书笔记