在Maven入门-4.Maven的依赖中,咱们建立了2个以上的模块,每一个模块都是一个独立的maven project,在开始的时候咱们能够独立的编译和测试运行每一个模块,可是随着项目的不断变大和复杂化,模块会愈来愈多,就不能每个都编译测试了,这时Maven给出了聚合的配置方式。
所谓聚合,顾名思义,就是把多个模块或项目聚合到一块儿
如今新建一个专门负责聚合工做的Maven project(user-aggregator)
新建好以后的项目是以下状态:
这时咱们能够把里面的全部内容都删掉,只保留pom.xml便可。
java
在pom.xml中使用modules来聚合其它模块。
user-aggregator的pom.xml文件内容以下:mysql
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fz.user</groupId> <artifactId>user-aggregator</artifactId> <version>0.0.1-SNAPSHOT</version> <!--这里的打包方式须要为pom--> <packaging>pom</packaging> <modules> <module>../user-core</module> <module>../user-dao</module> <module>../user-log</module> <module>../user-service</module> </modules></project>
聚合完成后就可使用clean test 等命令来统一编译聚合进来的几个模块了,它的好处就是在一个项目中把其余项目都一次编译了。。git
在刚才的项目中,有不少重复的配置,有相同的groupId和version,有相同的log4j、juit等等的依赖,Maven中能够声明一个父POM供子POM继承。
能够把父pom理解为Java中的一个父类,而后pom.xml中的一些groupId,version,相同的依赖之类的均可以理解味Java父类的一些共有属性。子POM继承了该父POM,就继承了这些属性(groupId,version,相同的依赖)sql
groupId:项目组ID,项目坐标的核心元素version: 项目版本, 项目坐标的核心元素description: 项目的描述信息organization: 项目的组织信息inceptionYear: 项目的创始年份url: 项目的URL地址developers: 项目开发者信息contributors: 项目的贡献者信息distributionManagement: 项目的部署配置issueManagement: 项目的缺陷跟踪系统信息ciManagement: 项目的持续集成系统信息scm: 项目的[版本控制](http://lib.csdn.net/base/git "Git知识库")系统信息mailingLists: 项目的邮件列表信息properties: 自定义的maven属性dependencies: 项目的依赖配置dependencyManagement: 项目的依赖管理配置repositories: 项目的仓库配置build: 包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等reporting: 包括项目的报告输出目录配置、报告插件配置等
下面开始
新建一个父POM项目(user-parent),用于管理子POM中重复的”属性”。一样也是删除掉src/java/main等无用的目录。只留下pom.xml便可。
也能够把聚合的配置也放到该继承pom.xml文件中
新建好的结构以下:
user-parent中的pom.xml文件内容以下:apache
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fz.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!--这里的打包方式须要为pom--> <packaging>pom</packaging> <modules> <module>../user-core</module> <module>../user-dao</module> <module>../user-log</module> <module>../user-service</module> </modules></project>
user-core模块的pom.xml文件最初始内容以下maven
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fz.user</groupId> <artifactId>user-core</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>user-core</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> </dependency> </dependencies></project>
这里咱们能够把如下内容添加到user-parent的pom.xml中,让子POM来继承。测试
<groupId>com.fz.user</groupId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>
修改user-parent模块中的pom.xml,内容以下:ui
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fz.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--properties中能够自定义属性--> <junit.version>4.10</junit.version> <log4j.version>1.2.17</log4j.version> <hamcrest.version>1.3</hamcrest.version> </properties> <modules> <module>../user-core</module> <module>../user-dao</module> <module>../user-log</module> <module>../user-service</module> </modules></project>
而后在user-core模块中使用parent元素来实现继承,修改后的pom.xml以下:url
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 使用parent元素来实现继承 --> <parent> <groupId>com.fz.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 这里要加上relativePath来指定user-parent的pom.xml文件的绝对路径 --> <relativePath>../user-parent/pom.xml</relativePath> </parent> <artifactId>user-core</artifactId> <name>user-core</name> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!--这里使用自定义属性 --> <version>${junit.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <!--这里使用自定义属性 --> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <!--这里使用自定义属性 --> <version>${hamcrest.version}</version> </dependency> </dependencies></project>
除了普通属性能够被继承,dependency也能够被继承下来。咱们把user-core中的dependency放到user-parent中。
dependency的继承须要用dependencyManagement来管理。若是不使用dependencyManagement,每个子POM都会把父POM中的dependency继承下来。也就是说,每一个子模块中都会有所有的jar包,这确定是不行的
下面能够把user-core,user-log,user-dao,user-service几个模块中的全部dependency都加到user-parent中,而后在各个子POM中使用该dependency便可。
修改后的user-parent的pom.xml文件内容以下:spa
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.fz.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--properties中能够自定义属性--> <junit.version>4.10</junit.version> <log4j.version>1.2.17</log4j.version> <hamcrest.version>1.3</hamcrest.version> </properties> <!-- 继承中须要使用dependencyManagement来管理依赖 --> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <!--这里使用自定义属性--> <version>${junit.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <!--这里使用自定义属性--> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <!--这里使用自定义属性--> <version>${hamcrest.version}</version> </dependency> <dependency> <groupId>com.fz.user</groupId> <artifactId>user-core</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.fz.user</groupId> <artifactId>user-dao</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.fz.user</groupId> <artifactId>user-log</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </dependencyManagement> <modules> <module>../user-core</module> <module>../user-dao</module> <module>../user-log</module> <module>../user-service</module> </modules></project>
而后在user-core,user-log,user-dao,user-service几个模块中继承这些依赖。这里以user-core为例,user-core的pom.xml文件内容以下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 使用parent元素来实现继承 --> <parent> <groupId>com.fz.user</groupId> <artifactId>user-parent</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 这里要加上relativePath来指定user-parent的pom.xml文件的绝对路径 --> <relativePath>../user-parent/pom.xml</relativePath> </parent> <artifactId>user-core</artifactId> <name>user-core</name> <!-- 子POM继承父POM的dependency时须要什么依赖就添加什么依赖就好了 可是要去掉version。只保留groupId和artifactId便可 --> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> </dependency> </dependencies></project>
这样一来,每一个模块中就只会引用到本身定义的dependency中的依赖了。
例子:
如今想加入mysql的jar包,可是这个jar包只会在user-dao中使用,其余模块中不会用到。能够在user-parent和user-dao中分别增长一条dependency
而后查看user-dao模块中的jar包
上图中,user-log和user-core中没有mysql的依赖,因为user-service依赖了user-dao,因此也一样会有mysql-connector-java的依赖。