一、Maven多模块
当我们一个项目有多个模块时,我们想使用一个命令即可对多个模块进行构建。Maven聚合就是为了满足该需求的。
假设我们有两个模块A和B。想使用一个命令就构建A和B两个模块,我们需要创建一个额外的名为C的模块,然后通过该模块构建整个项目的所有模块。作为一个模块,它必须有自己的POM文件,但作为一个聚合项目,它的POM又有其特殊地方。如:
<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.test</groupId>
<artifactId>C</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<modules>
<module>A</module>
<module>B</module>
</modules>
</project>
上述POM文件有两个特殊的地方:一是打包类型必须为pom,二是有modules元素。
通常为了方便用户构建项目,通常将聚合模块放在项目目录的最顶层,其他模块则作为聚合模块的子目录。如果使用平行目录,则聚合模块的POM要作出相应修改:
<modules>
<module>../A</module>
<module>../B</module>
</modules>
以此可看出,module中的内容是其他模块所在目录,而不是模块名称。
二、继承
1.父模块和子模块
一个项目的多个模块往往会有大量重复的配置。在面向对象编程中,程序员可通过继承一定程度上减少代码重复。Maven中也有类似的继承机制。
父模块的POM只有一个特殊的地方就是打包类型必须为pom。将各种子模块中共同配置放到该父模块中。然后由其他模块来继承:
<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>
<artifactId>A</artifactId>
<groupId>com.test</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>./pom.xml</relativePath>
</parent>
<artifactId>A</artifactId>
</project>
上述POM文件中parent指明了父模块。relativePath元素指明了父模块pom.xml文件位置。默认值是目前模块的上层目录。子模块可以不指定groupId和artifactId。
2.可继承的POM元素
大多数元素都可被继承(是否意味着有些元素不能被继承??)
3.依赖管理
子模块会继承父模块的依赖,但是并不是所有子模块都需要父模块中的所有依赖,此时可使用 dependencyManagement 元素,在dependencyManagement中声明的依赖不会引入实际的依赖,不过它能够约束dependencies下的依赖使用。子模块只要指定依赖的groupId和artifactId即使显示指定该依赖。
4.插件管理
pluginManagement和dependencyManagement类似,用来管理插件。
三、聚合和继承的关系
两者的目的不同,聚合是为了方便构建,继承是为了消除重复配置。
对于聚合模块来说,它需要知道哪些被模块被聚合,但那些被聚合的模块不知道这个聚合模块的存在。
对于继承关系的父模块来说,它不知道有哪些子模块继承于它,但那些子模块才都必须知道自己的父模块。
现实中,通常将一个打包类型为pom的模块即作聚合模块,又作父模块。
四、反应堆
1.概述
所有反应堆是一个多模块项目中,所有模块组成的一个构建结构。根据各个模块之间的依赖关系,Maven会自动生成反应堆,要注意不能让两个模块互相依赖。
2.裁剪反应堆
一般来说,用户会选择构建整个项目或者模块某个模块,但有些时间,用户会想仅仅构建某些模块,而不所有模块。
-am --also-make 同时构建所列模块的依赖模块
-amd --also-make-dependents 同时构建依于所列模块的模块
-pl --projeccts <arg> 构建指定的模块,模块间用逗号分隔
-rf --resume-fron <arg> 从指定的模块开始构建,反应堆之前的模块不被构建。
分享到:
相关推荐
在Java开发中,Maven是一个强大...总结,Maven的聚合和继承是两种重要的项目组织方式,它们使得大型项目管理变得简单而高效。在实际开发中,合理利用这两个特性,可以有效地提高团队协作的效率,降低项目维护的复杂度。
Maven,作为Java开发中的构建工具,提供了强大的聚合(Aggregation)和继承(Inheritance)特性,使得多模块项目的管理变得高效且有序。本文将深入探讨如何利用这两个特性来创建一个复杂的多模块项目,并通过提供的...
在Maven中,"聚合"和"继承"是两个重要的特性,它们有助于管理和组织大型的多模块项目。 **一、Maven聚合** Maven聚合(Aggregation)是用来管理多个相关项目的方式,这些项目可能共享一部分代码或者有共同的构建...
本示例将深入探讨Maven中的“依赖”、“继承”和“聚合”这三个核心概念,帮助开发者更好地理解和应用Maven。 首先,我们来讨论"Maven依赖"。在Java开发中,一个项目往往需要引用其他库或者框架来完成特定功能。...
本篇文章将深入探讨Maven的两个重要特性:继承(Inheritance)和聚合(Aggregation),并结合提供的资源《一头扎进Maven3》第五讲源码及文档进行详细解释。 **一、Maven继承** Maven的继承机制允许我们在多个项目...
总结起来,Maven的依赖管理、聚合、继承和插件运行机制是构建和管理Java项目的重要工具。它们简化了项目的构建流程,提高了代码复用和项目协作的效率。理解并熟练掌握这些概念,对于Java开发者来说至关重要。
本文将深入探讨Maven的聚合与继承特性,并通过实例进行详细解释。 首先,Maven的依赖管理系统允许开发者声明项目所需的库和它们的版本,从而避免了版本冲突和手动管理jar包的问题。在Maven的POM(Project Object ...
在编程世界中,组合和继承是面向对象编程的两种核心机制,它们允许我们构建复用性和可扩展性极强的代码。本章我们将深入探讨这两种概念的联合使用,以及它们在C++中的实现。 组合(Composition)是创建复杂对象的一...
Maven 的聚合和继承特性可以很好地支持这种架构,通过不同的模块分别处理前端和后端的构建,保持项目结构清晰,便于团队协作。 在实践中,我们可能需要创建以下类型的 Maven 子项目: 1. 前端项目:通常使用 ...
### UML学习之依赖、关联、聚合、组合与继承 #### 一、泛化(Generalization) **概念:** 泛化表示的是类与类之间的继承关系、接口与接口之间的继承关系,或者是类对接口的实现关系。在UML中,泛化关系通常用一个带...
### 面向对象程序设计的关键概念:重载、继承、多态和聚合 #### 方法重载(Overloading) 在面向对象程序设计中,方法重载是一种非常实用的功能,它允许程序员定义多个具有相同名称但参数列表不同的方法。这种方法...
maven总结笔记-继承和聚合
在UML中,有六种主要的类间关系:继承、实现、依赖、关联、聚合和组合。理解这些关系对于设计高质量的软件架构至关重要。 1. **继承**: 继承是类与类之间的一种层次结构关系,表示一个类(子类)可以从另一个类...
总结来说,这个"Maven聚合项目"是一个集成了聚合、继承、插件管理和私服使用的实例,展示了如何高效地管理和构建多模块的Java项目。通过这种方式,开发团队可以更有效地协同工作,保证项目的稳定性和一致性。
UML 中继承、实现、依赖、关联、聚合、组合的联系与区别 UML 中的继承关系是指一个类继承另外一个类的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系。在 Java 中此类关系通过...
几种类间关系:继承、实现、依赖、关联、聚合、组合。可做为开发设计时速查手册。
在IT行业中,地图应用是不可或缺的一部分,特别是在大数据和地理信息系统(GIS)的背景下,点聚合技术显得尤为重要。本文将深入探讨“百度地图点聚合自定义样式”这一主题,旨在帮助开发者更好地理解和实现在百度...
本文将深入探讨UML中的五个关键关系:继承、实现、依赖、关联和聚合,以及它们在软件设计中的作用。 1. **继承(Inheritance)**: 继承是面向对象编程的核心概念之一,它允许一个类(子类或派生类)从另一个类...