继承机制,项目可以通过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>
它继承所有东西,包括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插件的版本。