一、maven聚合作用
假如一个有一个项目,有好几个系统,比如A系统负责收银,B系统负责人员管理,C系统负责考勤等。在开发过程中,如果需要打包则需要一个一个子系统打包过去,3个还好不是很麻烦,但是如果系统多起来了呢,这时使用maven聚合,创建一个管理其他子系统的工程,对这个一个工程打一次包,从而实现自动为所有子系统打包。
二、实现步骤
1.首先我们新建一个管理工程的工程
ran然后最后一步点击finish,这样一个父工程新建完成。
然后删除无用的项,下图中选中的都可以删除
然后在pom文件中加上如下配置
<packaging>pom</packaging>
这时,pom.xml具体内容如下:
2.然后我们新建对应人员管理系统a的模块,我们取名为maven-a,注意是新建模块,有两种方式新建
a.直接在当前父级工程下新建,这样建立好的模块,自然而然的就在父级工程下面,建立步骤如下
选中maven-parent---new---modile
选中maven
选择,next,在new module界面中,parent点击右边的三点,选择为none
然后一直点击next,直到finsh
这时maven-a的模块建立完成,
从上面的图片我们可以看到,maven-parent下多了一个maven-a的模块,而pom文件中,多出了如下内容。
<modules>
<module>maven-a</module>
</modules>
b.在file下新建模块,这样建立好的模块,自然而然的与父级工程平级,建立步骤如下
file---new---module
后续步骤,与前面新建maven-a差不多类型,差别如下,
在new module的地方,需要自己自动选择add as module to的工程
选择,前面新建的父级工程,然后填入和前面新建a模块一样的groupid,然后点击next
再将maven-parent删除,点击finsh,这样与父级工程平级的模块B也就新建完成了。
这时我们再来查看项目结构,和paren工程的pom文件
可以发现,多出了一个与父级工程平级的项目,且pom文件中也多出了对应maven-b的modeul标签
然后给大家看下,a模块,b模块的pom文件
a
b
3.功能实现,首先我们来看下,整体的一个目录结构
可以发现,这个时候a模块,b模块都是没有打包的
然后,我们点击对应父级工程的package命令
这时,我们在来来看,整个目录结构
我们可以发现,在a模块,b模块都已经生成一个jar包,我们再点击父级工程的clean,则会将啊a,b模块打好的jar给清除掉
注意点:
聚合的功能中,聚合模块的pom.xml中通过modules->module
来引用被聚合的模块,被聚合的模块是不用感知自己被聚合了,所以被聚合的模块中pom.xml
中是不知道maven-parent
的存在的。这也是为什么a,b模块的pom文件中没有任何关于maven-paren工程的信息
而有些人这时肯定就会有疑问,为什么我公司使用的子项目中,会含有父级工程的信息,并会用paretn标签标记呢,
这时就会牵扯出下一个知识点,maven继承
一、maven继承的作用
经过上篇博文,maven 聚合的学习后,大家可能发现了,就是不同的模块中groupId、version是一样的
我们平常自己写java代码的时候,遇到一样的代码,都会自己想去抽取公共方法,同样maven也提供了同样的功能,实现我们 的需求,那就是maven继承
二、继承的实现案例
1.新建父级工程
父级工程还是用maven聚合案例中的父级工程
2.新建子模块
建立的方法同样有两种,方式同样跟聚合中新建模块的一样,唯一的差别在于,new module的时候,parent选择开始新建好的父级工程
之后则是一模一样的步骤。建立完后之后,我们来看下整体的项目架构、父级工程的pom文件,和c模块的Pom文件
c模块pom文件中多了paren标签,没有了重复的groupId、version,
再看父级工程的pom文件,跟之前新建b模块一样,多了module标签标注的c模块
然后,我们进入父级工程所在模块,利用mvn dependency:tree 这个插件可以根据pom.xml的配置,列出构件的依赖树信息。
从上面的图,我们可以看出,只有c模块继承了父级工程的所有依赖,而a,b两个模块因为没有继承父级工程,所有并未将依赖继承过来,意味着,如果a,b两个模块需要使用那些jar包的话,还需要自己去pom文件中定义。
上面我们看到了groupId、version、dependency中的依赖
在子pom.xml
中都没有写,这些都是从父pom.xml
中继承过来的,还有很多元素也可以被继承过来,下面我们列个清单:
三、可继承清单
-
groupId:项目组ID,项目坐标的核心元素
-
version:项目版本,项目坐标的核心元素
-
description:项目的描述信息
-
organization:项目的组织信息
-
inceptionYear:项目的创始年份
-
url:项目的url地址
-
developers:项目的开发者信息
-
contributors:项目的贡献者信息
-
distributionManagement:项目的部署配置信息
-
issueManagement:项目的缺陷跟踪系统信息
-
ciManagement:项目的持续集成系统信息
-
scm:项目的版本控制系统信息
-
mailingLists:项目的邮件列表信息
-
properties:自定义的maven属性配置信息
-
dependencyManagement:项目的依赖管理配置
-
repositories:项目的仓库配置
-
build:包括项目的源码目录配置、输出目录配置、插件管理配置等信息
-
reporting:包括项目的报告输出目录配置、报告插件配置等信息