8.4 聚合与继承的关系

基于前面三节的内容,读者可以了解到,多模块Maven项目中的聚合与继承其实是两个概念,其目的完全是不同的。前者主要是为了方便快速构建项目,后者主要是为了消除重复配置。

对于聚合模块来说,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在。

对于继承关系的父POM来说,它不知道有哪些子模块继承于它,但那些子模块都必须知道自己的父POM是什么。

如果非要说这两个特性的共同点,那么可以看到,聚合POM与继承关系中的父POM的packaging都必须是pom,同时,聚合模块与继承关系中的父模块除了POM之外都没有实际的内容,如图8-3所示。

8.4 聚合与继承的关系 - 图1

图 8-3 聚合关系与继承关系的比较

在现有的实际项目中,读者往往会发现一个POM既是聚合POM,又是父POM,这么做主要是为了方便。一般来说,融合使用聚合与继承也没有什么问题,例如可以将account-aggregator和account-parent合并成一个新的account-parent,其POM见代码清单8-21。

代码清单8-21 合并聚合和继承功能后的account-parent


<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>

<groupId>com.juvenxu.mvnbook.account</groupId>

<artifactId>account-parent</artifactId>

<version>1.0.0-SNAPSHOT</version>

<packaging>pom</packaging>

<name>Account Parent</name>

<modules>

<module>account-email</module>

<module>account-persist</module>

</modules>

<properties>

<springframework.version>2.5.6</springframework.version>

<junit.version>4.7</junit.version>

</properties>

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>${springframework.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-beans</artifactId>

<version>${springframework.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${springframework.version}</version>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context-support</artifactId>

<version>${springframework.version}</version>

</dependency>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>${junit.version}</version>

<scope>test</scope>

</dependency>

</dependencies>

</dependencyManagement>

<build>

<pluginManagement>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<configuration>

<source>1.5</source>

<target>1.5</target>

</configuration>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-resources-plugin</artifactId>

<configuration>

<encoding>UTF-8</encoding>

</configuration>

</plugin>

</plugins>

</pluginManagement>

</build>

</project>


在代码清单8-21中可以看到,该POM的打包方式为pom,它包含了一个modules元素,表示用来聚合account-persist和account-email两个模块,它还包含了properties、dependencyManagement和pluginManagement元素供子模块继承。

相应地,account-email和account-persist的POM配置也要做微小的修改。本来account-parent和它们位于同级目录,因此需要使用值为../account-parent/pom.xml的relativePath元素。现在新的account-parent在上一层目录,这是Maven默认能识别的父模块位置,因此不再需要配置relativePath,见代码清单8-22。

代码清单8-22 当父模块在上级目录时不再需要relativePath


<parent>

<groupId>com.juvenxu.mvnbook.account</groupId>

<artifactId>account-parent</artifactId>

<version>1.0.0-SNAPSHOT</version>

</parent>

<artifactId>account-email</artifactId>

<name>Account Email</name>

……