第八章 聚合與繼承

###8.1 聚合###   Maven聚合:當咱們的模塊很是多的時候,咱們想要一次構建多個項目,而不是到多個模塊的目錄下分別執行命令。Maven的聚合特性就是爲該需求服務的。
 爲了可以使用一條命令就能構建 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爲主目錄的相對路徑。 聚合模塊與其餘模塊的目錄結構並不是必定是父子關係。
  Maven約定:操作系統

  1. 首先聚合模塊必須爲pom,不然沒法構建。
  2. 必須有<modules>元素,它是實現聚合的最核心配置。這裏能夠聲明多個module元素。每一個module的值都是一個當前pom的相對目錄。模塊所處的目錄必須和<module>模塊所處的目錄一致。
  3. 爲了方便用戶構建項目,一般將聚合模塊放在項目目錄的最頂層,其餘模塊則做爲聚合模塊的子目錄存在。
  4. 聚合模塊的pom沒有實質性內容,只有一個pom.xml文件。只是用來幫助其餘模塊構建的工具。

###8.2 繼承###   可聲明父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>  
</project>

  子模塊聲明繼承以下:code

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

  最後,一樣還須要把 account-parent加入到聚合模塊account-aggregator中。 聚合的 POM以下:xml

<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>  
        <module> account-parent</module>  
    </modules>  
</project>
  • 子模塊沒有聲明groupId和version, 這兩個屬性繼承至父模塊。但若是子模塊有不一樣與父模塊的 groupId、version ,也可指定;
  • 不該該繼承artifactId,若是groupId ,version,artifactId 徹底繼承的話會形成座標衝突;另外即便使用不一樣的 groupId或version,一樣的 artifactId也容易產生混淆。
  • 使用繼承後 parent也必須像自模塊同樣加入到聚合模塊中。也就是在在聚合模塊的 pom中加入<module>account-parent</module>

  對於聚合模塊來講,它知道有哪些被聚合的模塊,而對於被聚合的模塊來講,它們不知道被誰聚合了,也不知道它的存在;對於繼承關係的pom來講,它不知道被哪些模塊繼承了,對於子pom來講,它必須知道要繼承誰。
  總之,聚合是爲了方便快速構建項目,繼承是爲了消除重複配置,在簡化pom的同時還能促進各個模塊配置的一致性。共同點是二者的packaging都是pom,聚合模塊與繼承關係中的父模塊除了pom以外都沒有實際內容。
  實際項目中咱們會發現,一個pom既是聚合pom,也是父pom,這麼作主要是爲了方便。
  Java成功的重要緣由之一就是他可以屏蔽大部分操做系統的差別,XML流行的緣由之一是全部語言都接受他。Maven用的人愈來愈可能是Maven提倡約定優於配置,這是Maven最核心的設計理念之一。繼承

相關文章
相關標籤/搜索