Maven的聚合模块和继承

最近从新读了一下《Maven实战》,记录一下一直被我忽略的聚合继承的关系。spa

聚合

首先,一个模块有一个pom(Project object Model)文件。当一个项目比较大的时候,按必定规则划分红不一样的模块是一个比较好的方式。这时候管理一个项目,若是每一个模块座位一个项目,那么打包编译的时候须要到每个模块下去执行mvn命令,太麻烦了。因而,有个继承模块。code

继承模块是一个空模块,只有pom文件,没有src、resource之类的目录结构。在pom文件中,用<modules><module>标签指定要管理的子模块。另外,<packaging>标签必须指定为pom。xml

  • e.g:
<packaging>pom</packaging>
    <modules>
            <module>account-model</module>
            <module>account-service</module>
            <module>account-task</module>
    </modules>
复制代码

以上状况适用于聚合模块处于目录顶层,子模块是聚合模块的子目录的状况。若是子模块和聚合模块是平行的目录关系,那么应该根据实际路径来写。继承

  • e.g:
<packaging>pom</packaging>
    <modules>
            <module>../account-model</module>
            <module>../account-service</module>
            <module>../account-task</module>
    </modules>
复制代码

这样,一个聚合模块就作好了,打包编译只须要在聚合模块下执行命令便可。ci

继承

当多个子模块须要的依赖相同和重复时,就推荐使用继承来消除重复了。声明一个可被继承的父模块,也是要把<packaging>标签指定为pom。子模块中指定父模块的坐标io

  • e.g:
<parent>
    <groupId>com.demo</groupId>
    <artifactId>account-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
复制代码

父模块中能够声明<dependencyManagement>,这个标签不会真的引入依赖,只是定义公用的坐标,子模块继承后仍然须要指定<groupId><artifactId>,可省略<version>标签。这么作看起来没节省多少工做,可是能有效管理依赖,避免项目出现不一样版本的依赖问题。编译

若是父模块和子模块是平行目录,那么子模块中须要指定父模块的地址。class

  • e.g:
<parent>
    <groupId>com.demo</groupId>
    <artifactId>account-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>../account-parent/pom.xml</relativePath>
  </parent>
复制代码

Maven默认是从上级目录解析父模块,因此若是子模块在父模块的下级目录,可省略<relativePath>import

通常推荐顶层目录中声明模块,它便是聚合模块,也是可被继承的父模块module

import依赖范围

一直不知道import依赖范围的做用,这里记录一下。

这个依赖范围,只在<dependencyManagement>元素下才有效。 它的做用是指向一个pom,将目标pom中的<dependencyManagement>配置导入而且合并到当前pom的<dependencyManagement>中。 也就是说,一个新模块的<dependencyManagement>中,有一堆配置在其余某个pom中的<dependencyManagement>里配置过了,此处就没必要再复制粘贴一遍,能够直接使用import引入进来。

  • e.g:有一个现成的a-parent模块配置了<dependencyManagement>,在b-parent模块中就没必要拷贝大段配置了
<dependencyManagement>
    <dependencies>
            <dependency>
                <groupId>com.demo</groupId>
                <artifactId>a-parent</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
    </dependencies>        
  </dependencyManagement>
复制代码
相关文章
相关标签/搜索