maven中的继承和聚合关系

多个maven模块的问题

这里以我们学习时遇到问题举例来说,为了方便大家查看代码,每次学习新知识的时候都会创建一个新的模块,这里有两个问题:

1.新建maven模块之后需要在pom文件中添加依赖,但是这些模块里面往往会有相同的依赖,每次都要添加就有些冗余和麻烦了,此时可以利用maven继承来解决这个问题。maven中的继承和java中的继承类似,子可以继承父中的内容,maven模块之间是可以配置成为继承关系的。

2.比如创建了5个maven模块,倘若希望对这5个模块都执行compile等maven命令时要执行5次,这里我们可以使用maven聚合来解决这个问题。

maven父子模块的继承关系

这里以idea为例,首先创建一个maven模块,这里可以不使用骨架,创建好之后可以将src文件夹删掉,只需要留下pom和idea的文件即可,子模块只是继承父模块中的一些依赖:

之后再创建一个maven模块,这里注意勾选父模块parent

这样子模块就可以继承父模块中的内容了,不过下面标签是不能继承的:

  • artifactId
  • name
  • prerequisites

这样创建具有继承关系的模块之后,子模块可以继承父模块中的依赖,以后其他maven模块再使用这些依赖的话,只需要继承父模块即可。

打开子模块的pom可以看到多了下面内容:

<parent>
    <artifactId>z-base</artifactId>
    <groupId>com.monkey1024</groupId>
    <version>1.0-SNAPSHOT</version>
    <relativePath>../zbase/pom.xml</relativePath>
</parent>

这里的parent的作用是指明了当前子模块的父模块是谁,跟java里面的extends关键字类似。对于继承来说,子是知道父是谁,但是父是不知道他有多少个子。

父模块中的dependencyManagement标签

倘若我们希望在子模块中全部继承父模块中的依赖时,在父模块中无需添加dependencyManagement标签。

倘若我们希望在子模块中有选择的继承父模块中的依赖时,在父模块dependencies外层需要添加dependencyManagement,例如:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>
</dependencyManagement>

此时子模块如果需要继承这个servlet依赖的话,需要填写groupId和artifactId

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
    </dependency>

如果在子模块中填写了全部gav标签的话,则不会继承父模块的依赖而是使用子模块中添加的这个依赖。

maven父子模块的聚合关系

以之前创建的父模块为父,此时在创建一个聚合关系的子模块,注意勾选add as module to:

创建好之后可以在父模块中看到下面标签

<modules>
    <module>teacher</module>
</modules>

其中module是子模块的名字,此时在子模块中是没有之前的parent标签的,也就是说这种聚合关系的父子模块,因为是要通过父模块来统一管理子模块,所以父知道子,子不知道父。这里可以创建多个聚合的子模块,当我们在父模块中使用maven命令的时候(比如打包package命令)会发现他所管理的子模块都会执行这些命令。

maven父子模块的聚合继承

在实际开发的时候,有些项目会创建多个maven模块,这里需要同时解决依赖继承和统一打包管理,因此会同时创建聚合继承关系的父子模块,这样就解决了这些问题了。

聚合继承指的是在父模块中有modules标签指定了子模块,在子模块中有parent标签指定了父模块,即父知道子,子也知道父。