Maven聚合与继承

Maven

用过maven的都知道,加入很少的配置,maven就能很好的帮我们管理项目。Maven提倡约定优于配置,这是Maven最核心的设计理念之。

约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。----来源百度百科。
Maven约定的项目结构如下:

MavenProject(项目根目录)
   |----src
   |     |----main
   |     |         |----java ——存放项目的.java文件
   |     |         |----resources ——存放项目资源文件,如spring, hibernate,properties等配置文件
   |     |----test
   |     |         |----java ——存放所有测试文件,如JUnit测试类
   |     |         |----resources ——存放项目测试用de资源文件,如spring, hibernate,properties等配置文件
   |----target ——项目构建目标输出目录
   |----pom.xml ----用于标识该项目是一个Maven项目,包括构建的一些配置


模块化

随着项目扩大,Maven项目也会越来越大。会带来一些麻烦。
1.比如修改了JS文件,但我们依旧要将整个Project都build一下。
2.所有人都在一个Project里面进行更改,可能导致混乱、冲突,也不利于维护。
3.每添加一个jar包或者依赖时,是为整个Project添加的。可见性很大。
因此,为了“高内聚,低耦合”考虑,maven对Project进行模块划分,每个模块都会对应着一个POM.xml文件,然后按照一定的关系组合(继承和聚合)成大的Project。也即是多模块系统。


聚合

把Project模块化成多个项目后,尤其是模块非常多的时候,我们需要一次构建多个项目,而不是到多个模块的目录下分别执行命令进行构建。Maven的聚合特性就是满足该需求的。
把多个模块或项目聚合到一起,我们可以建立一个专门负责聚合工作的project。通过构建这个新的Project,就可以完成整个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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com</groupId>
	<artifactId>mavenaggregator</artifactId>

	<!--  must be pom if aggregator -->
	<packaging>pom</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>my Maven Webapp</name>
	<url>http://maven.apache.org</url>
	
	<modules>
		<!--  relative paths to the directories of pom -->
	    <module>my-project</module>
	    <module>another-project</module>
	</modules>

</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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com</groupId>
	<artifactId>my-project</artifactId>
	<packaging>jar</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>my-project</name>
	<url>http://maven.apache.org</url>

</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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com</groupId>
	<artifactId>my-project</artifactId>
	<packaging>jar</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>my-project</name>
	<url>http://maven.apache.org</url>

</project>

这里说一下:聚合模块的pom没有实质性内容,只有一个pom.xml文件。只是用来帮助其他模块构建的工具。
packaging的方式为pom。对于聚合模块来说,其打包方式必须为pom, 否则无法构建!

modules: 实现聚合的配置,可以添加任意数量的module元素实现聚合。其中,每个module的值为当前POM的相对路径,即同目录下文件夹名。
为了方便,通常将聚合模块放在项目目录的最顶层,而其他模块则作为聚合模块的子目录存在。

继承

我们知道,在Java中为了复用,我们经常使用继承。同样在maven中,也是通过继承来减少重复,增加复用。
创建POM的父子结构,然后在父POM中声明一些配置供子POM继承。因为父模块只是为了帮助消除配置的重复,因此不需要src/main/java 文件。

父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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com</groupId>
	<artifactId>parent-project</artifactId>
	<packaging>pom</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>my-project</name>
	<url>http://maven.apache.org</url>

</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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com</groupId>
	<artifactId>child-project</artifactId>
	<packaging>jar</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>my-project</name>
	<url>http://maven.apache.org</url>

	<parent>
        <groupId>com</groupId>
        <artifactId>parent-project</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>

</project>
这里注意下,父pom.xml的 packaging 也要是 pom.
父pom里面可继承的pom元素很多, 官网也列出了,如下:




可继承的POM元素说明
groupId项目组ID,项目坐标的核心坐标;
version项目版本,项目坐标的核心坐标;
description项目的描述信息;
organization项目的组织信息;
inceptionYear项目的创始年份;
url项目的URL地址;
developers项目的开发者信息;
contributors项目的贡献值和信息;
distributionManagement项目的部署配置;
issueManagement项目的缺陷跟踪系统;
ciManagement项目的持续集成系统信息;
scm项目的版本控制系统信息;
mailingLists项目的邮件列表信息;
properties自定义的Maven属性;
dependencies项目的依赖配置;
dependencyManagement项目的依赖管理配置;
repositories项目的仓库配置;
build包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等;
reporting包括项目的报告输出目录配置、报告插件配置等。

实际项目中为了方便,我们会设置一个pom既是聚合pom,也是父pom。只需要在刚才的聚合子模块中加入如下元素即可。

	<parent>
        <groupId>com</groupId>
        <artifactId>mavenaggregator</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值