第八章 聚合与继承

###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最核心的设计理念之一。继承

相关文章
相关标签/搜索