maven的项目的继承与聚合
前言
maven的多模块项目一般需要运用到maven的继承和聚合特性。通常我们需要指定某个父项目或者聚合器,以实现maven的继承和聚合特性。需要注意的是,作为父项目的pom文件和作为聚合器的pom文件需要将打包类型指定为pom,
<packaging>pom</packaging>
同时要明确的了解,聚合器和父项目的区别,两者可以是同一个项目,也可以作为不同项目(即可以以一个pom文件为主导实现也可以以多个pom文件同时主导实现)
简单的说,
-
实现继承的父项目的目的是为了消除重复,并对项目版本等一些通用的参数进行统一管理。
-
而聚合是为了快速构建项目,如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合。
一、继承
Maven为构建管理带来的一个强大功能是项目继承的概念。虽然在诸如Ant之类的构建系统中,可以肯定地模拟继承,但Maven已经采取了额外的步骤,使项目继承明确地适用于项目对象模型。
1.父POM文件
在maven项目中,作为父项的项目通常只需要一个pom.xml文件即可,不需要其他标准目录结构的存在。
同时在这个pom.xml文件中,需要指定项目的打包方式为 pom,这一点上文已有提及。
一个基本的父项目pom文件
<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>group.one</groupId>
<artifactId>projetc-P</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
</project>
一个基本的子项目pom文件
<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标签内含该项目父项的坐标系元素的信息以及相对路径 -->
<parent>
<groupId>group.one</groupId>
<artifactId>projetc-P</artifactId>
<version>1.0-SNAPSHOT</version>
<!--relativePath元素不是必需的,但在搜索本地和远程存储库之前,可以帮助maven快速搜索到父项目 -->
<relativePath>../projetc-P/pom.xml</relativePath>
</parent>
<groupId>group.one</groupId>
<artifactId>project-A</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
</project>
2.父POM的遗产列表
maven说明了项目之间可以藉由继承来继承父项的元素,但这些元素不是全部,maven提供了继承的列表如下:
①继承元素列表
基础元素
| 由父类继承而来的元素 | 描述 |
|---|---|
| groupId | 项目组id |
| version | 版本 |
| dependencyManagement | 依赖管理 |
| dependencies | 依赖 |
| properties | 属性 |
项目信息描述元素
| 由父类继承而来的元素 | 描述 |
|---|---|
| description | 项目描述 |
| url | 项目url |
| inceptionYear | 创建年份 |
| organization | 组织 |
| licenses | 许可说明 |
| developers | 开发者 |
| contributors | 参与者 |
项目构建元素
| 由父类继承而来的元素 | 描述 |
|---|---|
| build | 构建元素,包括插件管理,插件列表,资源配置等等 |
报告配置元素
| 由父类继承而来的元素 | 描述 |
|---|---|
| reporting | 报告配置 |
环境配置元素
| 由父类继承而来的元素 | 描述 |
|---|---|
| mailingLists | 邮件列表 |
| scm | SCM的URL,该URL描述了版本库和如何连接到版本库。 |
| issueManagement | 项目的问题管理系统(Bugzilla, Jira, Scarab,或任何你喜欢的问题管理系统)的名称和URL |
| ciManagement | 项目持续集成信息 |
| repositories | 发现依赖和扩展的远程仓库列表 |
| pluginRepositories | 插件的远程仓库列表 |
| profiles | 配置文件 |
②未继承的元素
仅展示几个常见的元素
| 由父类继承而来的元素 | 描述 |
|---|---|
| artifactId | 工件id(项目组内唯一) |
| name | 项目名称 |
| prerequisites | 描述了这个项目构建环境中的前提条件 |
3.继承的常用配置
我们已经在概念上了解了实现继承的父项目的目的是为了消除重复,并对项目版本等一些通用的参数进行统一管理。那么具体是如何实现的呢?
①properties配置
在版本控制上,我们可以使用properties标签将项目的所有子项目的版本进行定义,如下:
父项pom文件配置
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo.common</groupId>
<artifactId>project-P</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<url>http://maven.apache.org</url>
<properties>
<project-A.version>1.0-SNAPSHOT</project-A.version>
<project-B.version>1.0-SNAPSHOT</project-B.version>
<project-C.version>1.0-SNAPSHOT</project-C.version>
<project-D.version>1.0-SNAPSHOT</project-D.version>
<project-E.version>1.0-SNAPSHOT</project-E.version>
</properties>
子项目pom文件配置
<parent>
<groupId>com.demo.common</groupId>
<artifactId>project-P</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../project-P/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>project-A</artifactId>
<!--注意此处版本使用占位符,内为由父项目继承而来的属性 -->
<version>${project-A.version}</version>
<packaging>jar</packaging>
这样我们就可以只在一个pom文件中管理控制所有子项的版本了,在项目迭代开发的时候,这个功能将十分有用。同时,我们还可以定义一些大部分子项目都需要使用的通用属性。例如项目编码格式的管理:
<properties>
<!--设置项目编码格式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--输出报告的编码格式 -->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
②pluginManagement 和 dependencyManagement 配置
我们已经清楚的了解到,pluginManagement 与 plugins 的区别,以及dependencyManagement 与dependencies的区别 (如不清楚 ,请查阅 https://blog.csdn.net/weixin_43740223/article/details/89574742)。
通常我们在父项目中对项目通用的插件以及依赖进行声明和定义版本,并在子项目中引入,以达到在父项目中统一管理版本以及具体配置的作用。
示例:
父项目pom
<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.demo.common</groupId>
<artifactId>project-P</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<url>http://maven.apache.org</url>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.demo.common</groupId>
<artifactId>project-utils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
<configuration>
<uniqueVersion>false</uniqueVersion>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<failOnError>true</failOnError>
<verbose>true</verbose>
<fork>true</fork>
<!-- <compilerArgument>-newark</compilerArgument>-->
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.2</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.zeroturnaround</groupId>
<artifactId>jrebel-maven-plugin</artifactId>
<version>1.1.5</version>
<configuration>
<addResourcesDirToRebelXml>true</addResourcesDirToRebelXml>
<alwaysGenerate>true</alwaysGenerate>
<showGenerated>true</showGenerated>
</configuration>
<executions>
<execution>
<id>generate-rebel-xml</id>
<phase>process-resources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
子项目pom
<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>
<parent>
<groupId>com.demo.common</groupId>
<artifactId>project-P</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../project-P/pom.xml</relativePath>
</parent>
<groupId>com.demo.web</groupId>
<artifactId>project-web</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<url>http://maven.apache.org</url>
<dependencies>
<dependencies>
<dependency>
<groupId>com.demo.common</groupId>
<artifactId>project-utils</artifactId>
</dependency>
</dependencies>
</dependencies>
<build>
<finalName>projetc-web</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
二、聚合
在maven官方文档中,将具有模块的项目称为多模块或聚合器项目。这里所称的模块就是我们pom文件中的modules 以及 module 标签包含的代码块。一个modules下包含多个module,标签所提供的主要功能是一次性打包多个项目。书写modules标签的pom文件所在项目成为聚合器,其packaging标签应将打包类型指定为pom,且项目中除了pom文件不需要但不强制其他目录及文件的存在。
1.POM配置
<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
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion> 4.0.0 </modelVersion>
<groupId> org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<packaging>pom</packaging>
<modules>
<module>模块1</module>
<module>模块2</module>
<module>模块3</module>
</modules>
</project>
列出模块列表时,我们不需要考虑模块间的依赖关系以及排列顺序,实际上maven将完成这部分工作。他将对项目间进行拓扑排序(参考:https://www.jianshu.com/p/3347f54a3187 ),以整理依赖关系。
由于实现maven继承的 父项目 和聚合器之间具有的相同特性 和 功能的契合,通常我们将同一个pom文件定义为聚合器和父项。
注意: module 标签内应该书写相对路径,例如:…/demo-common-base
2.打包
我们在聚合器中书写了几个模块后,应该在聚合器项目 下 执行打包操作。
- 使用maven命令时,应跳转到聚合器项目目录下 执行 mvn package/install/deploy 操作。
- 使用集成开发环境时,如下所示为idea
接下来我们通过一个项目 来 进行实战演练。
三、测试项目
查看 : https://blog.csdn.net/weixin_43740223/article/details/89674593