1、maven聚合
在maven模块化开发过程中,要把一个项目的多个模块安装到本地仓库中,需要对各个模块执行install命令。也可以将其放在一起运行,这样的方式就被称为聚合。
比如将项目A、B、C执行聚合打包安装,此时创建一个D项目,将D项目的packing设置为pom,使用<modules>
标签将前面三个项目聚合,然后在D项目执行install命令,A、B、C三个项目就会被同时打包安装到本地仓库中。
<groupId>com.jsun.test</groupId>
<artifactId>D</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>D</name>
<url>http://maven.apache.org</url>
<!-- 将A、B、C项目聚合 -->
<modules>
<module>../A</module>
<module>../B</module>
<module>../C</module>
</modules>
D项目执行install命令后,控制台执行结果如下:
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] C
[INFO] B
[INFO] A
[INFO] D
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building C 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
。。。。。。
[INFO] ------------------------------------------------------------------------
[INFO] Building B 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
。。。。。。
[INFO] ------------------------------------------------------------------------
[INFO] Building A 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
。。。。。。
[INFO] ------------------------------------------------------------------------
[INFO] Building D 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
。。。。。。
[INFO] Reactor Summary:
[INFO]
[INFO] C .................................................. SUCCESS [ 5.915 s]
[INFO] B .................................................. SUCCESS [ 0.162 s]
[INFO] A .................................................. SUCCESS [ 0.127 s]
[INFO] D .................................................. SUCCESS [ 0.061 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.553 s
[INFO] Finished at: 2016-07-31T22:58:54+08:00
[INFO] Final Memory: 17M/112M
2、maven继承
上述A、B、C三个项目都是用junit,在它们各自的pom.xml中都进行了配置,此时就重现了许多的重复,给维护、管理带来很多不便。
maven提供了向java中继承的概念和功能,将公共组件提到父类中,子类通过继承使用。
例子:
新建项目P作为项目A、B、C的公共父类:
<groupId>com.jsun.test</groupId>
<artifactId>P</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 将packing更改为pom -->
<packaging>pom</packaging>
<name>P</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>3.8.1</junit.version>
</properties>
<!-- 使用dependencyManagement标签管理依赖,实际管理的是依赖的版本号,让
所有子项目中引用对应依赖而不用显式的列出版本号;
依赖并不会在当前项目引入 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
然后A(B、C)项目继承项目P:
<!-- 使用parent标签,实现对父模块的继承 -->
<parent>
<groupId>com.jsun.test</groupId>
<artifactId>P</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<!-- 定义子模块的坐标信息,如果子项目与父项目的groupId、version相同,则去掉groupId和version,继承使用父模块的groupId或(和)version -->
<artifactId>A</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<!-- 使用继承的父模块的版本号dependencyManagement中管理的版本号 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
补充说明:
dependencies标签管理的依赖可以被子模块共享,比如一个父模块parent引入了junit依赖,在子模块child中自动被引入,实现依赖共享,也就是说子模块一下子就把父模块所有的依赖拿到了;
dependencyManagement标签管理的依赖无法被子模块共享(确切的说应该是除了版本号的其它信息无法共享),比如一个父模块parent引入了junit依赖,在子模块child中并无法被自动引入,此时child需要手动引入junit包,但是自己不用管理版本号,也就是不再用version标签。
总结:在子模块继承父模块的关系中,dependencies实现对依赖的统一管理,主要为了让子模块共享所有依赖;dependencyManagement实现的是对版本号的统一管理,子模块并不会共享所有模块,即不会一下子拿到所有依赖。