您的位置:首页 > 其它

Maven聚合与继承

2017-10-17 17:09 477 查看

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息