maven学习笔记(五)聚合与继承

1.将一个项目划分成多个模块

聚合特性能够把各个模块聚合在一起创建。一次构件多个子模块。

继承特性能帮助抽取各模块相同的依赖和插件等配置,简化pom,促进各模块配置的一致性。

2配置

groupId:一个项目的子模块都应使用同样的groupId

artifactId:应该使用一致的前缀

version:如果一起开发和发布,还应该使用同样的version

(1)聚合项目pom.xml(用于聚合)

<packaging>pom</packaging>//聚合项目的打包方式packaging的值必须是pom

在打包方式为pom的maven项目中声明module元素(父模块,子模块),module的值是一个当前pom的相对目录

聚合模块里包含子模块结构:

  <modules>
  	<module>xx</module>
  	<module>xx</module>
  </modules>

平行目录结构:

  <modules>
  	<module>../xx</module>
  	<module>../xx</module>
  </modules>


(2)父模块pom.xml(用于继承)

用于消除配置的重复。

<packaging>pom</packaging>//聚合项目的打包方式packaging的值必须是pom

(3)子模块pom.xml

继承父模块

  <parent>
  	<groupId></groupId>
  	<artifactId></artifactId>
  	<version></version>
  	<relativePath></relativePath>
  </parent>

当构建项目时,maven会首先根据relativePath检查父pom,如果找不到,再从本地仓库查找。relativePath的默认值是../pom.xml,即父pom在上一层目录下。

正确设置relativePath非常重要,当开发团队的新成员从源码库签出一个包含父子模块关系的maven项目,由于只关心其中的某一个子模块,它就直接到该模块的目录下执行创建,此时,父模块是没有被安装到本地仓库的,因此如果子模块没有设置正确的relativePath,maven将无法找到父pom,将直接导致构建失败。

子模块不声明groupId和version,会隐式从父模块继承,如果需要使用与父模块不一样的groupId和version,可以在子模块中显式声明。

(4)可继承的pom元素(部分)

groupId,version

description:项目描述信息

organization:项目的组织信息

inceptionYear:项目的创始年份

url:项目的url地址

developers:项目的开发者信息

contributers:贡献者信息

distributionManagement:项目的部署配置

properties:自定义的maven属性

dependencies:项目的依赖配置

dependencyManagement:项目的依赖管理配置

repositories:项目的仓库配置

build:包括项目的源码目录配置,输出目录配置,插件配置,插件管理配置等

(5)依赖管理

父模块的依赖配置,一部分子模块需要继承,另一部分不需要继承。

这种情况使用<dependencyManagement>。

父模块

  <properties>
  	<springframework.version>2.5.6</springframework.version>
  	<junit.version>4.7</junit.version>
  </properties>
  <dependencyManagement>
  	<dependencies>
  		<dependency>
  			<groupId>junit</groupId>
  			<artifactId>junit</artifactId>
  			<version>${junit.version}</version>
  			<scope>test</scope>
  		</dependency>
  	</dependencies>
  </dependencyManagement>

这里使用的 dependencyManagement声明的依赖既不会给父模块引入依赖,也不会给子模块引入依赖,不过这段配置是会被继承的。

子模块

  <dependencies>
  	<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  	</dependency>
  </dependencies>

 子模块只需要配置groupId和artifactId就能引入父模块配置的依赖。

使用 dependencyManagement能统一项目范围中依赖的版本,不会发生多个子模块使用依赖版本不一致的情况。这可以帮助降低依赖冲突的几率。

使用import范围依赖导入依赖管理配置:

  	<dependency>
  		<groupId></groupId>
  		<artifactId></artifactId>
  		<version></version>
  		<type>pom</type>
  		<scope>import</scope>
  	</dependency>

依赖的type值为pom,import范围依赖由于其特殊性, 一般都是指向打包类型为pom的模块。

(6)插件管理pluginManagement

用法与dependencyManagement类似

3小结

maven的聚合与继承是两个概念。聚合是为了方便快速构建项目,继承是为了消除重复配置。

对于聚合模块,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。

对于继承关系的父pom,它不知道有哪些子模块继承于它,但那些子模块都必须知道自己的父pom是什么。

共同点:聚合pom与继承关系中的父pom的packaging都必须是pom;聚合模块和继承关系中的父模块除了pom之外都没有实际的内容。

在实际项目中,往往融合聚合和继承,一个pom既是聚合pom又是父pom。

4超级pom

任何一个maven项目都隐式继承该pom。maven3,超级pom在文件$MAVEN_HOME/lib/maven-model-builder-x.x.x.jar中的org/apache/maven/model/pom-4.0.0.xml路径下。

(1)超级pom关于仓库的定义

定义仓库和插件仓库的地址为:http://repo1.maven.org/maven2,并且都关闭了SNAPSHOT的支持。

(2)项目结构

(3)插件版本

(4)项目报告输出目录

(5)项目发布的profile

5反应堆

(1)反应堆的构建順序

maven按序读取pom,如果该pom没有依赖模块,那么就构建该模块,否则就先构建其依赖模块,如果该依赖还依赖于其他模块,则进一步先构建依赖的依赖。

(2)剪裁反应堆

一般情况,用户会选择构建整个项目或选择构建单个模块,但有些时候,用户会想要仅仅构建完整反应堆的某些个模块。

maven提供命令行支持剪裁反应堆,输入mvn-h可以看到这些选项:

-am 同时构建所列模块的依赖模块

-amd  同时构建依赖于所列模块的模块

-pl 构建指定的模块,模块间用逗号分隔

-rf 从指定的模块回复反应堆

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值