最近从新读了一下《Maven实战》,记录一下一直被我忽略的聚合
和继承
的关系。spa
首先,一个模块有一个pom(Project object Model)文件。当一个项目比较大的时候,按必定规则划分红不一样的模块是一个比较好的方式。这时候管理一个项目,若是每一个模块座位一个项目,那么打包编译的时候须要到每个模块下去执行mvn命令,太麻烦了。因而,有个继承模块。code
继承模块是一个空模块,只有pom文件,没有src、resource之类的目录结构。在pom文件中,用<modules>
和<module>
标签指定要管理的子模块。另外,<packaging>
标签必须指定为pom。xml
<packaging>pom</packaging>
<modules>
<module>account-model</module>
<module>account-service</module>
<module>account-task</module>
</modules>
复制代码
以上状况适用于聚合模块处于目录顶层,子模块是聚合模块的子目录的状况。若是子模块和聚合模块是平行的目录关系,那么应该根据实际路径来写。继承
<packaging>pom</packaging>
<modules>
<module>../account-model</module>
<module>../account-service</module>
<module>../account-task</module>
</modules>
复制代码
这样,一个聚合模块就作好了,打包编译只须要在聚合模块下执行命令便可。ci
当多个子模块须要的依赖相同和重复时,就推荐使用继承来消除重复了。声明一个可被继承的父模块,也是要把<packaging>
标签指定为pom。子模块中指定父模块的坐标io
<parent>
<groupId>com.demo</groupId>
<artifactId>account-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
复制代码
父模块中能够声明<dependencyManagement>
,这个标签不会真的引入依赖,只是定义公用的坐标,子模块继承后仍然须要指定<groupId>
和<artifactId>
,可省略<version>
标签。这么作看起来没节省多少工做,可是能有效管理依赖,避免项目出现不一样版本的依赖问题。编译
若是父模块和子模块是平行目录,那么子模块中须要指定父模块的地址。class
<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依赖范围的做用,这里记录一下。
这个依赖范围,只在<dependencyManagement>
元素下才有效。 它的做用是指向一个pom,将目标pom中的<dependencyManagement>
配置导入而且合并到当前pom的<dependencyManagement>
中。 也就是说,一个新模块的<dependencyManagement>
中,有一堆配置在其余某个pom中的<dependencyManagement>
里配置过了,此处就没必要再复制粘贴一遍,能够直接使用import引入进来。
<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>
复制代码