两个不同的项目模块
crmx2-comm模块
<project>
<groupId>cn.ikantalk.crmx2</groupId>
<artifactId>crmx2-comm</artifactId>
<version>1.0.0</version>
<name>CRM Comm Module</name>
<packaging>jar</packaging>
......
</project>
crmx2-core模块
<project>
<groupId>cn.ikantalk.crmx2</groupId>
<artifactId>crmx2-core</artifactId>
<version>1.0.0</version>
<name>CRM Comm Module</name>
<packaging>jar</packaging>
......
</project>
分析
通过对两个项目的pom.xml的对比,发现很多元素及元素值都是重复的,例如:groupId, version,packaging 等。
在java开发中,重复的内容通常都会被提取出来,归纳到父类中,而各自的特性做为子类的定义,并继承父类,以达到代码重用的目的。这种设计的优点就不用赘述了。
在maven中也有类似的机制来实现这种设计思路:定义一个父pom.xml,用于子pom.xml的继承,将原有的在各个子类中重复的定义 的内容都放到父pom.xml中。
如何继承
目录结构
将要创建的目录结构如下:
|_pom.xml //父pom
|_crmx2-core
|_pom.xml //子pom
|_crmx2-comm
|_pom.xml //子pom
根据父pom.xml与子pom.xml的位置关系,来调整子pom中的relativePath元素的值。见下面的子pom.xml的定义。
创建用于被继承的父pom.xml
<project>
<groupId>cn.ikantalk.crmx2</groupId>
<artifactId>crmx2-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>CRMx2 Parent Pom</name>
</project>
注意:
- packaging元素的值必须是:pom,和聚合一样。
- groupId和version元素的值与原有的两个子pom.xml的值相同
修改子pom.xml
<proejct>
<parent>
<groupId>cn.ikantalk.crmx2</groupId>
<artifactId>crmx2-parent</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<artifactId>crmx2-comm</artifactId>
<name>CRMx2 Comm</name>
</project>
注意:
- 子pom.xml中多了parent元素,在parent元素中指明了父pom.xml的坐标,同时使用relativePath指明了父pom.xml的相对位置。如上,realtivePath的值,说明父pom.xml文件在当前目录的上一层。
- 子pom.xml中没有指定groupId和version,因为已经隐式地从父pom.xml中继承了这两个元素,使配置更加简洁。当然,如果子模块要使用不同的groupId和version也没有问题,直接在子模块中声明即可。
- artifactId和name的值必须在子模块中明确指定,而且不能与父模块的相同!(毕竟,哪有父子两人的名字是一模一样的)