一、Maven項目的聚合
現在項目越來越複雜,一般情況下,一個項目包括多個模塊。
假設有個orchid項目,包括兩個模塊:orchid-server和orchid-support。
它們在文件系統的目錄結構如下所示
orchid
--pom.xml
--orchid-support
--src
--pom.xml
--orchid-server
--src
--pom.xml
那麼如何把它們作爲一個多模塊的maven項目配置呢?
orchid/pom.xml的配置如下:
<modelVersion>4.0.0</modelVersion>
<groupId>com.stear.orchid</groupId>
<artifactId>orchid</artifactId>
<version>0.1</version>
<packaging>pom</packaging>
<name>orchid</name>
<description>The orchid project of stear</description>
<url>http://orchid.stear.com</url>
<modules>
<module>orchid-server</module>
<module>orchid-support</module>
</modules>
這個pom.xml的配置關鍵在兩點:(1)packaging類型爲pom;(2)<modules>模塊的引入。
<module>orchid-server</module>
表示在當前目錄(也就是上面pom.xml所在目錄)包括一個文件夾orchid-server。如果orchid-server和orchid在同一目錄的話,那麼配置應該是
<module>../orchid-server</module>
二、Maven項目的繼承
在上面的例子中只有聚合,也就是說orchid-support和orchid-server是不知道有個總項目或者說父項目存在的,因爲我們沒有在orchid-support/pom.xml和orchid-server/pom.xml中加入任何東西。那麼orchid-support和orchid-server也是不能從orchid項目繼承任何東西的。如果需要繼承的話,那麼需要在子項目的配置中加入<parent>配置:
orchid-support:
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.stear.orchid</groupId>
<artifactId>orchid</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>orchid-support</artifactId>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.stear.orchid</groupId>
<artifactId>orchid</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>orchid-server</artifactId>
上面兩個配置在<parent>中都忽略了<relativePath>標籤,<relativePath>的默認值是../pom.xml,也就是從父目錄中尋找pom.xml。
如果你的父項目在其他地方,那麼要手工加入改配置
<parent>
<groupId>com.stear.orchid</groupId>
<artifactId>orchid</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>parent project orchid directory/pom.xml</relativePath>
</parent>
這樣子項目可以從父項目中繼承元素。可繼承的元素包括:
groupId
version
description
organization
inceptionYear
url
developers
contributors
distributionManagement
issueManagement
ciManagement
scm
mailingLists
properties
dependencies
dependencyManagement
repositories
build
reporting
三、聚合和繼承的關係
聚合和繼承本質上沒什麼關係。聚合是爲了快速構建,只要在總項目中執行命令就會自動構建包含的某塊項目。繼承是爲了消除重複配置,各個子項目可以繼承父項目中的配置
對於聚合的總項目來說,它知道有哪些項目被聚合在一起,而各個模塊對總的項目是一無所知的。
對於繼承的父項目來說,它不知道哪些項目會繼承它,但是子項目明確指明瞭父項目。
通常來說,父項目和總項目是一個項目。也是爲了結構的清晰可見。