Maven继承

1年前 (2024-04-27)
Maven 在设计时,借鉴了 Java 面向对象中的继承思想,提出了 POM 继承思想。

当一个项目包含多个模块时,可以在该项目中再创建一个父模块,并在其 POM 中声明依赖,其他模块的 POM 可通过继承父模块的 POM 来获得对相关依赖的声明。对于父模块而言,其目的是为了消除子模块 POM 中的重复配置,其中不包含有任何实际代码,因此父模块 POM 的打包类型(packaging)必须是 pom。

如图 1 所示,一个项目中存在如下多个模块。

Maven 继承

 

图1:多模块项目各模块关系图


如上图所示:

  • App-UI-WAR 依赖于 App-Core-lib 和 App-Data-lib。

  • Root 是 App-Core-lib 和 App-Data-lib 的父模块。

  • Root 在它的依赖部分定义了 junit 4.9、mysql-connector-java 5.1.18 以及 c3p0 0.9.1 作为其依赖。


App-UI-WAR 的 pom.xml 配置如下。

<project xmlns="http://maven.apache网站站点" rel="nofollow" />

<project xmlns="http://maven.apache网站站点" rel="nofollow" />

<project xmlns="http://maven.apache网站站点" rel="nofollow" />

<project xmlns="http://maven.apache网站站点" rel="nofollow" />

mvn dependency:list


令执行结果如下。

[INFO] Scanning for projects...

[INFO]

[INFO] -------------------< net.biancheng.www:App-Core-lib >-------------------

[INFO] Building App-Core-lib 1.0

[INFO] --------------------------------[ jar ]---------------------------------

[INFO]

[INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ App-Core-lib ---

[INFO]

[INFO] The following files have been resolved:

[INFO] junit:junit:jar:4.9:compile

[INFO] log4j:log4j:jar:1.2.17:compile

[INFO] c3p0:c3p0:jar:0.9.1:compile

[INFO] mysql:mysql-connector-java:jar:5.1.18:runtime

[INFO] org.hamcrest:hamcrest-core:jar:1.1:compile

[INFO]

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 0.921 s

[INFO] Finished at: 2021-04-14T15:09:18+08:00

[INFO] ------------------------------------------------------------------------


可以看到,App-Core-lib 有 5 个依赖项,其中 junit 4.9、mysql-connector-java 5.1.18 以及 c3p0 0.9.1 是从父模块 Root 中继承的;log4j 1.2.17 是该模块本身的 POM 中声明的;hamcrest 1.1 是 junit 4.9 传递下来的依赖项。 

 

2. 在令行窗口中,跳转到子模块 App-Data-lib 的目录下,执行以下令,查看该模块依赖列表。

mvn dependency:list


令执行结果如下。

[INFO] Scanning for projects...

[INFO]

[INFO] -------------------< net.biancheng.www:App-Data-lib >-------------------

[INFO] Building App-Data-lib 1.0

[INFO] --------------------------------[ jar ]---------------------------------

[INFO]

[INFO] --- maven-dependency-plugin:2.8:list (default-cli) @ App-Data-lib ---

[INFO]

[INFO] The following files have been resolved:

[INFO] junit:junit:jar:4.9:compile

[INFO] c3p0:c3p0:jar:0.9.1:compile

[INFO] mysql:mysql-connector-java:jar:5.1.18:runtime

[INFO] org.hamcrest:hamcrest-core:jar:1.1:compile

[INFO]

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time: 0.938 s

[INFO] Finished at: 2021-04-14T15:37:28+08:00

[INFO] ------------------------------------------------------------------------


可以看到,App-Data-lib 有 4 个依赖项,其中 junit 4.9、mysql-connector-java 5.1.18 以及 c3p0 0.9.1 是从父模块 Root 中继承的;hamcrest 1.1 是 junit 4.9 传递下来的依赖项。 

可继承的 POM 元素

在上面的例子中,我们可以看出 groupId、version 以及项目的依赖配置 dependencies 是可以被继承的,除了这 3 个元素之外,还有哪些元素可以被继承呢?

Maven 可通过继承获得 POM 元素,如下表。

元素

描述

groupId

项目组 ID,项目坐标的核心元素

version

项目版本,项目坐标的核心元素

description

项目的描述信息

organization

项目的组织信息

inceptionYear

项目的创始年份

url

项目的URL地址

developers

项目的开发者信息

contributors

项目的贡献者信息

distributionManagement

项目的部署配置

issueManagement

项目的缺陷跟踪系统信息

ciManagement

项目的持续集成系统信息

scm

项目的版本控制系统信息

mailingLists

项目的邮件列表信息

properties

自定义的Maven属性

dependencies

项目的依赖配置

dependencyManagement

项目的依赖管理配置

repositories

项目的仓库配置

build

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

reporting

包括项目的报告输出目录配置、报告插件配置等