Maven学习总结(三)——聚合和继承

  

   一:聚合

  

      1·何为聚合?

                   是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系

  

      2·聚合的引入为了解决什么样的问题?

     在开发中,如果有两个或两个以上独立的maven 工程,则不可避免的一个操作就是分别执行mvn命令,那为了能够使用一条命令就能构件这两个子模块,那maven聚合就应运而生了。


  3·如何实现?

例如:我们现在的项目目录结构如图所示:




我们需要创建一个子目录:itoo_basic_teacher_aggregator,然后在该目录结构下创建一个pom.xml文件,(记得转换为maven项目)现在的项目目录结构如图所示:


Maven学习总结(三)——聚合和继承_第1张图片


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命令的输出效果图:


    大致内容为:该聚合工程构建的小结报告,包括各个模块构建是否成功,以及各个工程构建花费的时间,以及整个构建花费的时间以及内存的占用情况等。

  Maven学习总结(三)——聚合和继承_第2张图片

      

   二:继承


   1·何为继承?

  继承既是一种父与子的关系


   2·继承的引入为了解决什么样的问题?

   当我们各个子项目的pom文件中引入相同的依赖或是相同的配置(例如相同的groupIdversion),这    就意味着“重复”,这个时候,maven继承在一定程度上就可以帮助我们消除重复。


   3·如何实现?

          在项目列表中添加一个itoo-basic-teacher-parent子目录,同样,在该目录下添加一个pom.xml文件(同理,记得转换为maven项目),由于父模块只是为了帮助消除配置的重复,所以parent本身也不需要其它文件,只要有pom.xml文件即可。

itoo-basic-teacher-parentpom.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


   对于父子模块的继承关系内容中,可继承的 pom 元素很多,这里不再详细介绍,这里主要介绍相同的依赖如何在父类中管理。

   这里就要使用到标签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
		
		


    注意:这里使用 dependencyManagement 声明的依赖既不会给 itoo-basic-teacher-parent 带来依赖,也不会给子模块引入依赖,只不过这里的配置是会被继承的。现在子模块如果需要 spring 相关的依赖,只需显示声明 groupId, artifactId 即可。如果子模块不声明依赖的使用,也不会产生任何实际的效果。

4·疑问?

    有人可能会觉得,这种依赖管理机制看起来不会减少太多的pom配置,为什么不在父模块中直接使用dependencies呢?这样子模块不就可以直接继承并且不需要声明了吗?


这样会导致两个问题的产生:

     1·如果再在父模块下添加一个子模块,如果子模块不需要相关的spring包,这样方式也会将spring相关的jar传递依赖给该子模块,所以,子模块将失去灵活可配置性。

     2·子模块中不能明显的看到该子模块所依赖的jar包。如果工程巨大,给管理会造成不便。


综上所述,maven的最佳实践中提到:使用dependencyManagement管理父类依赖。


   三:聚合和继承关系

        

       相同点:pom文件的都必须是pom格式。

       不同点:聚合模块主要是为了方便快速的构建项目,继承主要是为了消除重复配置。

Maven学习总结(三)——聚合和继承_第3张图片







你可能感兴趣的:(Maven学习总结(三)——聚合和继承)