Maven的父子工程(继承)及聚合(多模块)
maven的父子工程(继承):
继承是 Maven 中很强大的一种功能,继承是为了抽取多个模块的公共配置,以实现统一/简化配置的目的。
父 POM 中的大多数元素都能被子 POM 继承。除了以下元素外,其它元素均可被子模块继承:
- artifactId
- prerequisites
- name
继承可以有效的避免多个子模块使用依赖版本不一致的情况, 有助于降低依赖冲突的几率.
父 pom 中的大多数元素都能被子 pom 继承, 在简化 pom 的同时, 还能够促进各个模块配置的一致性。
依赖的继承
-
父项目中定义
<dependencies>
,子项目直接继承了父项目的,从而不再需要引入这些依赖。 -
在 父 pom 中
<dependencyManagement>
标签配置的依赖既不会给它的子模块引入依赖,仅仅表示它的配置是可继承的。子项目一旦使用,则无需指定它们的版本信息!
关于<dependencyManagement>
用法:
- 父pom.xml声明依赖:
<dependencyManagement>
<dependencies>
<dependency><!-- 定义可能会使用的依赖 -->
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
</dependency>
<dependecy>...</dependecy><!-- 定义可能会使用的依赖 -->
<dependecy>...</dependecy><!-- 定义可能会使用的依赖 -->
</dependencies>
</dependencyManagement>
- 子项目引用依赖:
不需要定义版本号, 只用填写<groupId>
和<artifactId>
表示继承父项目的声明,
否则 maven 是不会加载父模块中声明的声明。
<dependencies>
<dependency>
<groupId>org.codehaus.mojo</groupId> <!-- 引用父pom的声明 -->
<artifactId>my-parent</artifactId>
~~ <version>2.0</version> ~~ <!-- 不需要指定版本信息! -->
</dependency>
</dependencies>
简单理解:
简单来说,我们写两个不同的功能那么我们需要建两个不同的 Maven Project,那么我们需要配置两次 pom 文件,它们可能有大部分依赖是相同的,我们也要重复配置。如果功能更多呢?我们需要重复配置很多相同的东西,父子工程的出现就大大的简化了这些。我们抽取公共配置放在父项目,而子项目可以继承父项目的配置,这样大大简化了配置
父项目:
通常 Maven 的父项目是一个特殊项目,本质上,它是因为了复用配置而存在的项目,而并非一个实际意义上的真实的项目,因此父项目下完全不需要存在 java 包和 resources 包,父项目下只需要存在一个 pom.xml 文件即可。
- 注意: 父项目的 package 类型是 pom 类型。
子项目:
注意: 子项目不一定非要在父项目里面,也可以和父项目是平级关系。
如何创建一个父子项目呢:
①正常创建一个Maven Project ,作为父项目。完成可去掉 java 和 resources。
②创建一个Maven Project,在它的pom文件中指明它的父项目是谁?使用parent元素,如下实例:
<!-- 指定它的父模块是谁 -->
<parent>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath></relativePath>
</parent>
<relativePath>
元素用于指明本项目(子项目)的父项目的 pom 文件的路径名。例如:
<!-- 对应写法,在硬盘上的目录层次结构中,子模块在父模块的『里面』。 -->
<relativePath>../pom.xml</relativePath>
<!-- 对应写法,在硬盘上的目录层次结构中,子模块和父模块『平级』。 -->
<relativePath>../parent-module/pom.xml</relativePath>
<!-- 对应写法,Maven 就不关心子模块和父模块在硬盘上的目录层次结构,它要求父模块在本地仓库中存在 -->
<relativePath />
-
如果完全没有
<relativePath>
元素,等同于:../pom.xml -
注意: 子项目不一定非得新建在父项目内。所以,默认的 ../pom.xml 并一定总是对的。
Maven聚合
Maven 聚合 功能是 继承 功能的『升级』。
即,Maven 多模块项目一定是父子项目,Maven 父子项目则不一定是多模块项目。
- Maven 继承(父子工程)的目的为了配置文件的复用和配置信息的统一管理。
- Maven 聚合(多模块工程)目的是项目功能上的拆分。
由于 Maven 多模块项目是父子项目的一种高级形式,因此,多模块项目也是有一个父模块包含一个或多个子模块,不过有几点不同:
-
多模块项目中,子项目一定是在父项目『里面』的。
-
多模块项目中,父项目中会『多出来』一个
<modules>
元素。
<modules>
<module>modele1-service</module> <!--指定的子项目1-->
<module>modele2-web</module> <!--指定的子项目2-->
<module>bbb</module> <!--指定的子项目3-->
</modules>
如何安装运行maven聚合项目?
在父模块的pom.xml中添加tomcat7的插件,然后正常的运行即可。tomcat7插件不要放在子模块的pom.xml身上,如果要放子模块上也只能放web模块身上。
而上面这几个模块都需要安装发布到本地仓库才能正常运行,如果这些模块有任何变化都需要重新安装发布到本地仓库才能生效。建议放在父模块的pom文件中,不容易出错!