【Java基础】Maven继承
1. 前言
Maven 在设计时,借鉴了 Java 面向对象中的继承思想,提出了 POM 继承思想。
2. Maven继承
当一个项目包含多个模块时,可以在该项目中再创建一个父模块,并在其 POM 中声明依赖,其他模块的 POM 可通过继承父模块的 POM 来获得对相关依赖的声明。对于父模块而言,其目的是为了消除子模块 POM 中的重复配置,其中不包含有任何实际代码,因此父模块 POM 的打包类型(packaging)必须是 pom。
如图 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 配置如下。
4.0.0 net.wangzhe.www App-UI-WAR 1.0 net.wangzhe.www App-Core-lib 1.0 net.wangzhe.www App-Data-lib 1.0父模块 POM 配置
父模块 Root 的 pom.xml 配置如下。
4.0.0 net.wangzhe.www Root 1.0 pom junit junit 4.9 test mysql mysql-connector-java 5.1.18 runtime c3p0 c3p0 0.9.1在父模块 Root 的 pom.xml 中,其打包类型(packaging)为 pom,并声明了 3 个依赖:junit 4.9、mysql-connector-java 5.1.18 以及 c3p0 0.9.1 。
子模块 POM 配置
App-Core-lib 的 pom.xml 配置如下。
4.0.0 net.wangzhe.www App-Core-lib 1.0 net.wangzhe.www Root 1.0 ../Root log4j log4j 1.2.17App-Data-lib 的 pom.xml 配置如下。
4.0.0 net.wangzhe.www App-Data-lib 1.0 net.wangzhe.www Root 1.0App-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 传递下来的依赖项。
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 元素可以省略,但这并不意味着当前模块没有 groupId 和 version,子模块会隐式的从父模块中继承这两个元素,即由父模块控制子模块的公司组织 id 以及版本,这样可以简化 POM 的配置。

