继承机制,项目可以通过parent元素使用继承,可以避免这种重复。当一个项目声明一个parent的时候,它从父项目的POM中继承信息。它也可以覆盖父POM中的值,或者添加一些新的值。

一、创建Parent工程,打包方式为pom

maven 多层parent maven继承多个parent_maven 多层parent

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

maven 多层parent maven继承多个parent_maven 多层parent_02

子模块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插件的版本。