一、聚合
爲了能夠使用一條命令就能構建account-email和account-persist兩個模塊,我們需要建立一個額外的名爲account-aggregator的模塊,然後通過該模塊構建整個項目的所有模塊。account-aggregator本身也是個Maven項目,它的POM如下
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.juvenxu.mvnbook.account</groupId>
<artifactId>account-aggregator</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Account Aggregator</name>
<modules>
<module>account-email</module>
<module>account-persist</module>
</modules>
</project>
注意:packaging的類型爲pom,module的值是一個以當前POM爲主目錄的相對路徑。
二、繼承
可聲明父POM供子POM繼承
父模塊POM如下:
<project>
<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>
</project>
子模塊聲明繼承如下:
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.juvenxu.mvnbook.account</groupId>
<artifactId>account-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../account-parent/pom.xml</relativePath>
</parent>
<artifactId>account-email</artifactId>
<name>Account Email</name>
...
</project>
注意:1、子模塊沒有聲明groupId和version,這兩個屬性繼承至父模塊。但如果子模塊有不同與父模塊的groupId,version也可指定;
2、不應該繼承artifactId,如果groupId,version,artifactId完全繼承的話會造成座標衝突;另外即使使用不同的groupId或version,同樣的artifactId也容易產生混淆。
3、使用繼承後parent也必須像自模塊一樣加入到聚合模塊中。也就是在在聚合模塊的pom中加入<module>account-parent</module>
三、聚合與繼承的關係
在現有的實際項目中一個POM既是聚合POM,又是父POM,這麼做主要是爲了方便