多个maven模块的问题
这里以我们学习时遇到问题举例来说,为了方便大家查看代码,每次学习新知识的时候都会创建一个新的模块,这里有两个问题:
- 新建maven模块之后需要在pom文件中添加依赖,但是这些模块里面往往会有相同的依赖,每次都要添加就有些冗余和麻烦了,此时可以利用maven继承来解决这个问题。maven中的继承和java中的继承类似,子可以继承父中的内容,maven模块之间是可以配置成为继承关系的。
- 比如创建了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标签指定了父模块,即父知道子,子也知道父。