maven中的继承和聚合关系

2021-02-06 16:43:19 194
爱秀

多个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可以看到多了下面内容:


    z-base
    com.monkey1024
    1.0-SNAPSHOT
    ../zbase/pom.xml

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

父模块中的dependencyManagement标签

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

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


    
        
            javax.servlet
            javax.servlet-api
            4.0.1
        
    

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

    
        javax.servlet
        javax.servlet-api
    

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

maven父子模块的聚合关系

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

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


    teacher

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

maven父子模块的聚合继承

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

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

分享
海报
194
上一篇:maven基础入门简介 下一篇:PHP中获取文件扩展名的方法有哪些

忘记密码?

图形验证码