Maven实战04-聚合与继承

Maven实战04-聚合与集成

本文暂时是maven实战的收尾了,对于maven还有一些构建私服等技能等到我docker更精进一些再来书写吧。

1.聚合

maven的聚合其实很简单,在POM文件中配置<modules>标签来,这样就可以用一条maven命令来构建几个模块。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<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>

<groupId>com.example</groupId>
<artifactId>maven_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>这是我的项目啦</name>
<modules>
<module>example-A</module>
<module>example-B</module>
</modules>
<packaging>pom</packaging>
</project>

maven聚合的文件结构

当然examle-A和example-B必须是单独的maven项目,有属于自己的pom文件。最外层的聚合POM的打包方式必须为POM。一般是使用上述的结构,但假如使用平级的目录结构。那么POM中<modules>必须带有路径,查看下面的举例。

1
2
3
4
<modules>
<module>../example-A</module>
<module>../example-B</module>
</modules>

2.继承

面向对象中最重要的特征之一继承,在maven中也是有所体现的。一处声明,多处使用。下面代码是创建SpirngBoot项目的一种方式,通过继承spring-boot-starter-parent来实现,需要使用<parent>标签。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<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>

<groupId>org.cunyu1943</groupId>
<artifactId>springDemo</artifactId>
<version>1.0-SNAPSHOT</version>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
</dependencies>

</project>

假如你想继承的是自己随便定义的POM文件,并没有进入仓库的话。也可以指定该POM文件的具体路径,参考下面的代码。

1
2
3
4
5
6
7
8
9
10
<parent>
<groupId>com.example</groupId>
<artifactId>maven_demo_parent</artifactId>
<version>1.0.0</version>
<relativePath>../demo/pom.xml</relativePath>
</parent>
<groupId>com.example</groupId>
<artifactId>maven_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<name>这是我的项目啦</name>

项目构建时,maven会先根据<relativePath>检查父POM,如果找不到再从本地仓库查找。

可继承的POM元素

在Java中,私有的方式是无法继承的,那么在maven中哪些pom元素可以被继承呢?

  1. groupId:项目组ID,项目坐标的核心元素。
  2. version:项目版本,项目坐标的核心元素。
  3. description:项目的描述信息。
  4. organization:项目的组织信息。
  5. inceptionYear:项目创始年份。
  6. url:项目的URL地址。
  7. developers:项目的开发者信息。
  8. contributors:项目的贡献者信息。
  9. distributionManagement:项目的部署配置。
  10. issueManagement:项目的缺陷跟踪系统信息。
  11. ciManagement:项目的持续集成系统信息。
  12. scm:项目的版本控制系统信息。
  13. mailingLists:项目的邮件列表信息。
  14. properties:自定义的maven属性
  15. dependencies:项目的依赖配置。
  16. dependencyManagement:项目的依赖管理配置。
  17. repositories:项目的仓库配置。
  18. build:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等。
  19. reporting:包括项目的报告输出目录配置、报告插件配置等。

依赖管理

上面的列表里包含了dependencies元素,说明依赖是会被继承的。但是某些时候我们并不一定需要父类中全部的依赖。这时maven提供的<dependencyManagement>元素既能让子模块继承到父模块的依赖配置,又能保证灵活性,因为默认情况下的声明不会引入实际的依赖。只有在子模块中显式地指定了groupId和artifactId才能被继承。这样地话子模块不用写版本和依赖范围。

1
2
3
4
5
6
7
8
9
10
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>

import依赖范围也就是只能在dependencyManagement下使用,使用这个范围地依赖通常指向一个POM,在父类继承中通常会指向父类POM中地依赖范围。

插件也有类似地用法,使用<pluginManagement>使插件的继承就像上面依赖管理那样

3.反应堆的构建顺序

听起来名字很酷,实际上反应堆就是你的maven项目。反应堆的构建顺序就是你maven项目的构建顺序。在此之前先总结一下现在我们知道了maven可以支持聚合与依赖。

聚合:为了方便快速构建项目。

继承:消除重复配置。

他们相同的地方在于聚合POM和继承中父POM的packaging都必须是pom,且他们除了pom以外都没有实际的内容。在实际项目中,一个POM往往既是聚合POM,也是父POM。

举例说明构建顺序

比如说在一个模块中是这样的情况。

1
2
3
4
5
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
</modules>

然后B和C都继承了D,构建顺序应该是A-D-B-C。首先从上往下构建,如果遇到父类,就先初始化父类。

裁剪反应堆

有时候我们可能会选择构建单个模块或者仅仅构建完整反应堆中的某些个模块,那么使用以下命令就很合适。maven提供了很多命令行参数来实现。

裁剪反应堆

具体使用类似于这样A,B均指代你的模块名。

1
mvn clean install -pl A,B

总结

本文是最后一篇,实际上maven还有很多知识点可以探究,比如超级POM的内容。但是了解这些对于使用maven来进行开发,绰绰有余了。学习还是拿捏好度就行。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!