实际项目中,可能正要构建一个大型的系统,但又不想一遍又一遍的重复同样的依赖元素,这种情况是经常出现的。不过还好,maven提供了继承机制,项目可以通过parent元素使用继承,可以避免这种重复。当一个项目声明一个parent的时候,它从父项目的POM中继承信息。它也可以覆盖父POM中的值,或者添加一些新的值。
一、创建Parent工程,打包方式为pom
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.nchu.maven</groupId> <artifactId>Parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <!--消除多模块依赖配置重复,我们知道依赖是可以继承的,既父模块中定义的依赖,子模块可自动继承,
但是有些子模块需要,有些不需要的情况下该怎么办呢?那就必须用 <dependencyManagement> 标签了,
子模块的 pom 中就可以使用
<dependency>
<groupId>junit</groupId>
<artifactid>junit</artifactId>
</dependency> ,
这样引用,没有引用的就不会自动继承;--> <dependencyManagement> <dependencies> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies> </dependencyManagement>
<!--聚合--> <modules> <module>../HelloMaven</module> <module>../MavenLearn</module> <module>../WebProject</module> <module>FirstModel</module> <module>SecondModel</module> </modules> </project>
聚合:将一个工程拆分为多个模块
二、在各个子工程中引用父工程
在父工程主目录上右键,选择other,搜索maven,选择Maven Model
子模块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.nchu.maven</groupId> <artifactId>Parent</artifactId> <version>0.0.1-SNAPSHOT</version>
<!--
Maven假设父POM在本地仓库中可用,或者在当前项目的父目录(../pom.xml) 中可用。
如果两个位置都不可用,默认行为还可以通过relativePath元素被覆盖:
-->
<!--<relativePath>../Parent/pom.xml</relativePath>--> </parent> <artifactId>FirstModel</artifactId> <dependencies>
<!--子工程引入该依赖时,已经继承了父工程的依赖信息,子工程中的pom.xml就不需要指定以来的版本号了;--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> </dependencies> </project>
当一个项目指定一个父项目的时候,Maven在读取当前项目的POM之前,会使用这个父POM作为起始点。它继承所有东西,包括groupId和version。有了parent元素,一个POM就只需要定义一个artifactId。但这不是强制的,可以有一个不同的groupId和version,但如果不提供值,Maven就会使用在父POM中指定的值。如果开始使用Maven来管理和构建大型的多模块项目,你就会常常创建许多共享一组通用的groupId和version的项目。
当继承一个POM,可以选择直接使用继承的POM信息,或者选择覆盖它。一个Maven POM从它父POM中可以继承定义符(groupId和artifactId中至少有一个必须被覆盖) 、依赖、开发者和贡献者、插件列表、报告列表、插件执行 (id匹配的执行会被合并)、插件配置。
当Maven继承依赖的时候,它会将父项目中定义的依赖添加到子项目中。可以使用Maven的这一特征来指定一些在所有项目被广泛使用的依赖,让它们从顶层POM中继承。例如,如果系统全局使用Log4J日志框架,可以在你顶层 POM中列出该依赖,任何从该项目继承POM信息的项目会自动拥有Log4J依赖。 类似的,如果能确定每个项目都在使用同样版本的一个Maven插件,可以在顶层父POM的pluginManagement元素中显式的列出该Maven插件的版本。