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

  

   一:聚合

  

      1·何为聚合?

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

  

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

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


  3·如何实现?

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




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



itoo_basic_teacher_aggregator本身作为一个maven项目,它必须有自己的pom文件,且仅有一个pom文件,这是因为聚合模块仅仅是帮助聚合其他模块构建的工具,本身并无实质性的内容。但做为一个聚合项目,其pom结构又不同于其它单独项目,特殊地方在于<modules>标签:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
	<parent>
	<groupId>com.dynamic</groupId>
		<artifactId>itoo-basic-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		<relativePath>../itoo-basic-parent/pom.xml</relativePath>
	</parent>

  <artifactId>itoo-basic-teacher-aggregator</artifactId>
  
  <packaging>pom</packaging>
  <name>itoo-basic-teacher-aggregator</name>
  <description>aggregate itoo-basic-teacher modules</description>
  <!---实现聚合的核心配置:module值代表当前pom的相对目录-->
  <modules>
  	<module>../itoo-basic-teacher-core</module>
  	<module>../itoo-basic-teacher-web</module>
  	<module>../itoo-basic-teacher-ear</module>
  </modules>  
</project>

   注意两点:

     1·对于聚合模块,期打包方式packaging标签值必须为pom,否则无法完成构建。

     2·关于目录结构:

      a.聚合模块和其他子模块为父子关系:路径如图所示

  <modules>
  	<module>itoo-basic-teacher-core</module>
  	<module>itoo-basic-teacher-web</module>
  	<module>itoo-basic-teacher-ear</module>
  </modules>  
                   b. 聚合模块和其他子模块为平行关系:路径如图所示(上例中为平级目录结构)   

  <modules>
  	<module>../itoo-basic-teacher-core</module>
  	<module>../itoo-basic-teacher-web</module>
  	<module>../itoo-basic-teacher-ear</module>
  </modules>

  

    聚合模块运行mvn cleaninstall命令的输出效果图:


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

  

      

   二:继承


   1·何为继承?

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


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

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


   3·如何实现?

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

itoo-basic-teacher-parentpom.xml文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<!-- modelVersion指定了当前POM模型的版本-->
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.dynamic</groupId>
	<artifactId>itoo-basic-parent</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>
</project>


而子模块的pom.xml文件需要添加父模块的节点,如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.dynamic</groupId>
		<artifactId>itoo-basic-teacher-parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
		<relativePath>../itoo-basic-teacher-parentr/pom.xml</relativePath>
	</parent>
	
	<artifactId>itoo-basic-teacher-core</artifactId>
	<packaging>ejb</packaging>
</project>


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

   这里就要使用到标签dependencyManagement了。该元素技能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性。怎么解释:意思就是,在dependencyManagement元素下的依赖声明不会引入实际的依赖,不过它能约束dependencies下的依赖使用。parent中添加如下配置:

<prperties>
	<spring.version>4.0.9.RELEASE</spring.version>
</properties>
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
			<scope>provided</scope>
			</dependency>
			
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-core</artifactId>
				<version>${spring.version}</version>
				<scope>provided</scope>
			</dependency>
	
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
			<scope>provided</scope>
		</dependency>
		</dependencies>
</dependencyManagement>


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

4·疑问?

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


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

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

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


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


   三:聚合和继承关系

        

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

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







评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值