一、聚合

  如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合

1.1、聚合配置代码

1 <modules>
2 <module>模块一</module>
3 <module>模块二</module>
4 <module>模块三</module>
5 </modules>

  例如:对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合

1 <modules>
2 <module>../Hello</module>
3 <module>../HelloFriend</module>
4 <module>../MakeFriends</module>
5 </modules>

  其中module的路径为相对路径。

二、继承

  继承为了消除重复,我们把很多相同的配置提取出来,例如:grouptId,version等

2.1、继承配置代码

1 <parent>
2 <groupId>me.gacl.maven</groupId>
3 <artifactId>ParentProject</artifactId>
4 <version>0.0.1-SNAPSHOT</version>
5 <relativePath>../ParentProject/pom.xml</relativePath>
6 </parent>

2.2、继承代码中定义属性

  继承代码过程中,可以定义属性,例如:

1 <properties>
2 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3 <junit.version>4.9</junit.version>
4 <maven.version>0.0.1-SNAPSHOT</maven.version>
5 </properties>

  访问属性的方式为${junit.version},例如:

1 <dependency>
2 <groupId>junit</groupId>
3 <artifactId>junit</artifactId>
4 <version>${junit.version}</version>
5 <scope>test</scope>
6 </dependency>

2.3、父模块用dependencyManagement进行管理

 1 <dependencyManagement>
2 <dependencies>
3 <dependency>
4 <groupId>junit</groupId>
5 <artifactId>junit</artifactId>
6 <version>${junit.version}</version>
7 <scope>test</scope>
8 </dependency>
9 <dependency>
10 <groupId>cn.itcast.maven</groupId>
11 <artifactId>HelloFriend</artifactId>
12 <version>${maven.version}</version>
13 <type>jar</type>
14 <scope>compile</scope>
15 </dependency>
16 </dependencies>
17 </dependencyManagement>

  这样的好处是子模块可以有选择行的继承,而不需要全部继承。

三、聚合与继承的关系

  聚合主要为了快速构建项目,继承主要为了消除重复

四、聚合与继承实战演练

  创建四个Maven项目,如下图所示:

  

  这四个项目放在同一个目录下,方便后面进行聚合和继承

  

  Parent项目是其它三个项目的父项目,主要是用来配置一些公共的配置,其它三个项目再通过继承的方式拥有Parent项目中的配置,首先配置Parent项目的pom.xml,添加对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合以及jar包依赖,pom.xml的配置信息如下:

  Parent项目的pom.xml配置

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3 <modelVersion>4.0.0</modelVersion>
4
5 <groupId>me.gacl.maven</groupId>
6 <artifactId>Parent</artifactId>
7 <version>0.0.1-SNAPSHOT</version>
8 <packaging>pom</packaging>
9
10 <name>Parent</name>
11 <url>http://maven.apache.org</url>
12
13 <!-- 对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合 -->
14 <modules>
15 <module>../Hello</module>
16 <module>../HelloFriend</module>
17 <module>../MakeFriends</module>
18 </modules>
19
20 <!-- 定义属性 -->
21 <properties>
22 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
23 <junit.version>4.9</junit.version>
24 <maven.version>0.0.1-SNAPSHOT</maven.version>
25 </properties>
26
27 <!-- 用dependencyManagement进行jar包依赖管理 -->
28 <dependencyManagement>
29 <!-- 配置jar包依赖 -->
30 <dependencies>
31 <dependency>
32 <groupId>junit</groupId>
33 <artifactId>junit</artifactId>
34 <!-- 访问junit.version属性 -->
35 <version>${junit.version}</version>
36 <scope>test</scope>
37 </dependency>
38 <dependency>
39 <groupId>me.gacl.maven</groupId>
40 <artifactId>Hello</artifactId>
41 <!-- 访问maven.version属性 -->
42 <version>${maven.version}</version>
43 <scope>compile</scope>
44 </dependency>
45 <dependency>
46 <groupId>me.gacl.maven</groupId>
47 <artifactId>HelloFriend</artifactId>
48 <!-- 访问maven.version属性 -->
49 <version>${maven.version}</version>
50 </dependency>
51 </dependencies>
52 </dependencyManagement>
53 </project>

  在Hello项目的pom.xml中继承Parent项目的pom.xml配置

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3
4 <modelVersion>4.0.0</modelVersion>
5 <artifactId>Hello</artifactId>
6
7 <!-- 继承Parent项目中的pom.xml配置 -->
8 <parent>
9 <groupId>me.gacl.maven</groupId>
10 <artifactId>Parent</artifactId>
11 <version>0.0.1-SNAPSHOT</version>
12 <!-- 使用相对路径 -->
13 <relativePath>../Parent/pom.xml</relativePath>
14 </parent>
15
16 <dependencies>
17 <dependency>
18 <groupId>junit</groupId>
19 <artifactId>junit</artifactId>
20 </dependency>
21 </dependencies>
22 </project>

  在HelloFriend项目的pom.xml中继承Parent项目的pom.xml配置

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3 <modelVersion>4.0.0</modelVersion>
4 <artifactId>HelloFriend</artifactId>
5 <name>HelloFriend</name>
6
7 <!-- 继承Parent项目中的pom.xml配置 -->
8 <parent>
9 <groupId>me.gacl.maven</groupId>
10 <artifactId>Parent</artifactId>
11 <version>0.0.1-SNAPSHOT</version>
12 <relativePath>../Parent/pom.xml</relativePath>
13 </parent>
14 <dependencies>
15 <dependency>
16 <!-- Parent项目的pom.xml文件配置中已经指明了要使用的Junit的版本号,因此在这里添加junit的依赖时,
17 可以不指明<version></version>和<scope>test</scope>,会直接从Parent项目的pom.xml继承 -->
18 <groupId>junit</groupId>
19 <artifactId>junit</artifactId>
20 </dependency>
21 <!-- HelloFriend项目中使用到了Hello项目中的类,因此需要添加对Hello.jar的依赖
22 Hello.jar的<version>和<scope>也已经在Parent项目的pom.xml文件配置中已经指明了
23 因此这里也可以省略不写了
24 -->
25 <dependency>
26 <groupId>me.gacl.maven</groupId>
27 <artifactId>Hello</artifactId>
28 </dependency>
29 </dependencies>
30 </project>

  在MakeFriends项目的pom.xml中继承Parent项目的pom.xml配置

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3 <modelVersion>4.0.0</modelVersion>
4 <artifactId>MakeFriends</artifactId>
5 <!-- 继承Parent项目中的pom.xml配置 -->
6 <parent>
7 <groupId>me.gacl.maven</groupId>
8 <artifactId>Parent</artifactId>
9 <version>0.0.1-SNAPSHOT</version>
10 <relativePath>../Parent/pom.xml</relativePath>
11 </parent>
12 <dependencies>
13 <dependency>
14 <!-- Parent项目的pom.xml文件配置中已经指明了要使用的Junit的版本号,因此在这里添加junit的依赖时,
15 可以不指明<version></version>和<scope>test</scope>,会直接从Parent项目的pom.xml继承 -->
16 <groupId>junit</groupId>
17 <artifactId>junit</artifactId>
18 </dependency>
19 <dependency>
20 <!-- MakeFriends项目中使用到了HelloFriend项目中的类,因此需要添加对HelloFriend.jar的依赖
21 HelloFriend.jar的<version>和<scope>也已经在Parent项目的pom.xml文件配置中已经指明了
22 因此这里也可以省略不写了
23 -->
24 <groupId>me.gacl.maven</groupId>
25 <artifactId>HelloFriend</artifactId>
26 </dependency>
27 </dependencies>
28 </project>

  以上的四个项目的pom.xml经过这样的配置之后,就完成了在Parent项目中聚合Hello、HelloFriend、MakeFriends这三个子项目(子模块),而Hello、HelloFriend、MakeFriends这三个子项目(子模块)也继承了Parent项目中的公共配置,这样就可以使用Maven一次性构建所有的项目了,如下图所示:

  

  选中Parent项目的pom.xml文件→【Run As】→【Maven install】,这样Maven就会一次性同时构建Parent、Hello、HelloFriend、MakeFriends这四个项目,如下图所示:

  

Maven学习总结(七):Maven的聚合和继承的更多相关文章

  1. Maven学习总结(5)——聚合与继承

    Maven学习总结(五)--聚合与继承 一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 <modules> <module> ...

  2. (转)Maven学习总结(七)——eclipse中使用Maven创建Web项目

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(七)——eclipse中使用Maven创建Web项目 一.创建Web项目 1.1 选择建立Maven Project 选择File -&g ...

  3. 【转】Maven实战(九)---模块聚合和继承

    原博文出自于:http://blog.csdn.net/liutengteng130/article/details/47001831   感谢! 类之间有聚合和继承关系,Maven也具备这样的设计原 ...

  4. (转)Maven学习总结(六)——Maven与Eclipse整合

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(六)——Maven与Eclipse整合 一.安装Maven插件 下载下来的maven插件如下图所示:,插件存放的路径是:E:/MavenP ...

  5. (转)Maven学习总结(四)——Maven核心概念

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(四)——Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Mav ...

  6. (转)Maven学习总结(二)——Maven项目构建过程练习

    孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(二)——Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项 ...

  7. Maven实战(九)---模块聚合和继承

    类之间有聚合和继承关系,Maven也具备这种设计原则. 那么Maven的pom是怎样进行聚合与继承的呢? 一.什么是聚合?为什么要用聚合? 上一篇博客介绍了模块化的基本知识. 有了模块化,那么我们项目 ...

  8. MAVEN学习笔记之Maven插件的应用(4)

    MAVEN学习笔记之Maven插件的应用(4) <build> <pluginManagement> <plugins> <plugin> <gr ...

  9. MAVEN学习笔记之Maven生命周期和插件简介(3)

    MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...

  10. Maven学习(七)仓库

    * Maven仓库 在项目开发中,  项目目录下往往会有一个lib目录,用来存放第三方依赖jar文件, 如spring log4j jar等文件, Maven仓库就是放置JAR文件(WAR,ZIP,P ...

随机推荐

  1. 2016级算法第六次上机-F.AlvinZH的学霸养成记VI

    1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那 ...

  2. jinja url_for js 参数

    在JavaScript中,也就是客户端,向flask路由服务器端使用post请求并在url_for中传递参数,服务器端获取不到该参数, Jinja不能使用Javascript变量,如下所示: var ...

  3. sparksql连接mysql

    1.方法1:分别将两张表中的数据加载为DataFrame /* * 方法1:分别将两张表中的数据加载为DataFrame * */ /* Map<String,String> option ...

  4. 让 Linux grep 的输出不换行

    在Redhat中亲测. 本来ps -ef的输出是不会换行的,但是 ps -ef | grep java 就换行了. 如果想让grep完的结果不要换行,找到两种方法. 1. 在后面拼接 less -S: ...

  5. 虚拟机下设置CentOS 7使用固定IP地址

    1.设置虚拟机使用桥接网络 2.查看安装虚拟机软件的电脑IP信息 3.启动CentOS 7进行设置

  6. redux在componentDidMount中出现的问题 --- state 不变

    遇到这样一个问题: 在组件的componentDidMount中,我需要使用到redux中存储的某个状态. 但是有趣的是,当我再render中使用相同的状态时,状态会改变,但是在conponentDi ...

  7. accessToken的使用

    1.accessToken是啥,干嘛用? 形象解释:申请调兵-->皇帝同意-->兵符-->开始调兵 拿到用户在第三方平台的唯一的标识; 获取用户的nickname,头像,邮箱等其他信 ...

  8. 《LeetBook》leetcode题解(3):Longest Substring Without Repeating Characters[M]——哈希判断重复

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  9. hadoop nameNode 无法启动

    /************************************************************STARTUP_MSG: Starting NameNodeSTARTUP_M ...

  10. IOS仿微信朋友圈好友展示

    前几天小伙伴要帮他做一个群聊功能,里面有好友列表,要求和微信的差不多(见下图),让小伙伴自己实现了下,他将CollectionView放在tableView的tableHead中,可是当添加好友或删除 ...