一:聚合
1·何为聚合?
是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系
2·聚合的引入为了解决什么样的问题?
在开发中,如果有两个或两个以上独立的maven 工程,则不可避免的一个操作就是分别执行mvn命令,那为了能够使用一条命令就能构件这两个子模块,那maven聚合就应运而生了。
3·如何实现?
例如:我们现在的项目目录结构如图所示:
我们需要创建一个子目录:itoo_basic_teacher_aggregator,然后在该目录结构下创建一个pom.xml文件,(记得转换为maven项目)现在的项目目录结构如图所示:
itoo_basic_teacher_aggregator本身作为一个maven项目,它必须有自己的pom文件,且仅有一个pom文件,这是因为聚合模块仅仅是帮助聚合其他模块构建的工具,本身并无实质性的内容。但做为一个聚合项目,其pom结构又不同于其它单独项目,特殊地方在于
4.0.0
com.dynamic
itoo-basic-parent
0.0.1-SNAPSHOT
../itoo-basic-parent/pom.xml
itoo-basic-teacher-aggregator
pom
itoo-basic-teacher-aggregator
aggregate itoo-basic-teacher modules
../itoo-basic-teacher-core
../itoo-basic-teacher-web
../itoo-basic-teacher-ear
注意两点:
1·对于聚合模块,期打包方式packaging标签值必须为pom,否则无法完成构建。
2·关于目录结构:
a.聚合模块和其他子模块为父子关系:路径如图所示
itoo-basic-teacher-core
itoo-basic-teacher-web
itoo-basic-teacher-ear
b.
聚合模块和其他子模块为平行关系:路径如图所示(上例中为平级目录结构)
../itoo-basic-teacher-core
../itoo-basic-teacher-web
../itoo-basic-teacher-ear
聚合模块运行mvn cleaninstall命令的输出效果图:
大致内容为:该聚合工程构建的小结报告,包括各个模块构建是否成功,以及各个工程构建花费的时间,以及整个构建花费的时间以及内存的占用情况等。
二:继承
1·何为继承?
继承既是一种父与子的关系
2·继承的引入为了解决什么样的问题?
当我们各个子项目的pom文件中引入相同的依赖或是相同的配置(例如相同的groupId和version),这 就意味着“重复”,这个时候,maven继承在一定程度上就可以帮助我们消除重复。
3·如何实现?
在项目列表中添加一个itoo-basic-teacher-parent子目录,同样,在该目录下添加一个pom.xml文件(同理,记得转换为maven项目),由于父模块只是为了帮助消除配置的重复,所以parent本身也不需要其它文件,只要有pom.xml文件即可。
itoo-basic-teacher-parent的pom.xml文件如下:
4.0.0
com.dynamic
itoo-basic-parent
0.0.1-SNAPSHOT
pom
而子模块的pom.xml文件需要添加父模块的节点,如下:
4.0.0
com.dynamic
itoo-basic-teacher-parent
0.0.1-SNAPSHOT
../itoo-basic-teacher-parentr/pom.xml
itoo-basic-teacher-core
ejb
这里就要使用到标签dependencyManagement了。该元素技能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。怎么解释:意思就是,在dependencyManagement元素下的依赖声明不会引入实际的依赖,不过它能约束dependencies下的依赖使用。parent中添加如下配置:
4.0.9.RELEASE
org.springframework
spring-webmvc
${spring.version}
provided
org.springframework
spring-core
${spring.version}
provided
org.springframework
spring-web
${spring.version}
provided
4·疑问?
有人可能会觉得,这种依赖管理机制看起来不会减少太多的pom配置,为什么不在父模块中直接使用dependencies呢?这样子模块不就可以直接继承并且不需要声明了吗?
这样会导致两个问题的产生:
1·如果再在父模块下添加一个子模块,如果子模块不需要相关的spring包,这样方式也会将spring相关的jar传递依赖给该子模块,所以,子模块将失去灵活可配置性。
2·子模块中不能明显的看到该子模块所依赖的jar包。如果工程巨大,给管理会造成不便。
综上所述,maven的最佳实践中提到:使用dependencyManagement管理父类依赖。
三:聚合和继承关系
相同点:pom文件的
不同点:聚合模块主要是为了方便快速的构建项目,继承主要是为了消除重复配置。