Maven的继承与聚合
maven的继承
继承和聚合有相似的地方,继承的特性是指建立一个父模块,我们项目中的多个模块都做为该模块的子模块,将各个子模块相同的依赖和插件配置提取出来,从而简化配置文件,父模块的打包方式必须为pom,否则无法构建项目。父模块和聚合模块经常可以做到合二为一。
如何配置继承:
- 1.说到继承肯定是一个父子结构,我们先创建一个父工程
- 2.<packaging>: 作为父模块的POM,其打包类型也必须为POM
- 3.结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录
- 4.新的元素:<parent> , 它是被用在子模块中的
- 5.<parent>元素的属性:<relativePath>: 表示父模块POM的相对路径,在构建的时候,Maven会先根据relativePath检查父POM,如果找不到,再从本地仓库查找
- 6.relativePath的默认值: ../pom.xml
- 7.子模块省略groupId和version: 使用了继承的子模块中可以不声明groupId和version, 子模块将隐式的继承父模块的这两个元素.
可被继承的POM元素:
groupId:项目组ID,项目坐标的核心元素
version: 项目版本, 项目坐标的核心元素
description: 项目的描述信息
organization: 项目的组织信息
inceptionYear: 项目的创始年份
url: 项目的URL地址
developers: 项目开发者信息
contributors: 项目的贡献者信息
distributionManagement: 项目的部署配置
issueManagement: 项目的缺陷跟踪系统信息
ciManagement: 项目的持续集成系统信息
scm: 项目的版本控制系统信息
mailingLists: 项目的邮件列表信息
properties: 自定义的maven属性
dependencies: 项目的依赖配置
dependencyManagement: 项目的依赖管理配置
repositories: 项目的仓库配置
build: 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等
reporting: 包括项目的报告输出目录配置、报告插件配置等
dependencyManagement属性
我们知道dependencies是可以被继承的,这个时候我们就想到让我们的发生了共用的依赖元素转移到parent中,这样我们又进一步的优化了配置。
可是问题也随之而来,如果有一天我创建了一个新的模块,但是这个模块不需要这些parent的依赖,这时候如何处理?
dependencyManagement也是可以被继承的,这恰恰满足了我们的需要,
它既能够让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性
特性:在dependencyManagement中配置的元素既不会给parent引入依赖,也不会给它的子模块引入依赖,仅仅是它的配置是可继承的.
创建一个父级项目:
父级项目的pom.xml
<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.zl</groupId> <artifactId>book-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <!-- 项目的设置 --> <properties> <!-- 编码的处理 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 定义版本 --> <mybatis.version>3.4.5</mybatis.version> <oracle.version>10.2.0.5.0</oracle.version> </properties> <!-- 子项目继承依赖的配置,子项目根据实际需求,添加需要的依赖 --> <dependencyManagement> <!-- 添加mybatis的依赖 --> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!-- 添加oracle的依赖 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc14</artifactId> <version>${oracle.version}</version> </dependency> </dependencies> </dependencyManagement> <!-- 更改jdk版本: 使用插件 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> <!-- pluginManagement按需加载 --> <pluginManagement> <plugins> <!--添加Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <port>8888</port> <path>/</path> </configuration> </plugin> </plugins> </pluginManagement> </build> </project>
创建一个子类继承父类
子级继承父级项目的pom.xml
<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> <groupId>com.zl</groupId> <artifactId>test-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 默认的值为../pom.xml :表示父类的pom.xml的路径 如果relativePath找不到父项目的pom.xml,从本地仓库找 如果本地仓库,找不到,报错 开发阶段,推荐些写relativePath --> <relativePath>../user-parent/pom.xml</relativePath> </parent> <!-- 基础父类,地址不变,只需要填写名字 --> <artifactId>test-common</artifactId> <!-- entity没有需要导入的jar包不需要引入 --> </project>
在本层中添加需要的依赖
<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> <groupId>com.zl</groupId> <artifactId>book-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>test-mapper</artifactId> <!-- 添加本层需要的依赖 --> <dependencies> <!-- 添加上一层maven项目的依赖的代码 由于继承关系,上一层继承了父类,故本类也继承了test-parent父类 --> <dependency> <groupId>com.zl</groupId> <artifactId>book-common</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- 因为父类中定义了版本号,不需要定义--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> </dependencies> </project>
maven的聚合
我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,我们期望能够使用简单的操作来完成编译等工作,这时Maven给出了聚合的配置方式。所谓聚合,顾名思义,就是把多个模块或项目聚合到一起。
简单的说:我们在一个项目中会存在模块A和模块B,在各自的项目目录下,我们可以分别通过命令 mvn clean package 来构建各个模块,
但是如果我们想将这两个模块一起构建呢?
答案是我们需要建立一个模块C做为一个聚合模块。
建立一个聚合项目,满足如下几点要求:
- 1.该aggregator本身也做为一个Maven项目,它必须有自己的POM
- 2.它的打包方式必须为: pom
- 3.引入了新的元素:modules---module
- 4.版本:聚合模块的版本和被聚合模块版本一致
- 5.relative path:每个module的值都是一个当前POM的相对目录
- 6.目录名称:为了方便的快速定位内容,模块所处的目录应当与其artifactId一致(Maven约定而不是硬性要求),总之,模块所处的目录必须和<module>模块所处的目录 </module>相一致。
- 7.习惯约定:为了方便构建,通常将聚合模块放在项目目录层的最顶层,其它聚合模块作为子目录存在。这样当我们打开项目的时候,第一个看到的就是聚合模块的POM
- 8.聚合模块减少的内容:聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/Java、src/test/java等目录,因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。
- 9.聚合模块和子模块的目录:他们可以是父子类,也可以是平行结构,当然如果使用平行结构,那么聚合模块的POM也需要做出相应的更改。
注:在现有的实际项目中一个 POM既是聚合POM,又是父 POM,这么做主要是为了方便
使用聚合的好处
将多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后也需要逐个手动进行clean操作。而使用了聚合之后就可以批量进行Maven工程的安装、清理工作。