Maven继承和聚合特性

embedded/2024/9/23 9:34:14/

目录

Maven继承关系

1.继承概念

父POM

子模块

2.继承机制

3.示例

4.继承作用

背景

需求

5.注意事项

Maven聚合关系

1. 定义与概念

2. 实现方式

3. 特性与优势

4. 示例

5. 注意事项


Maven继承关系

1.继承概念

Maven 继承是指在 Maven 的项目中,定义一个父POM(Project Object Model),然后让其他Maven项目(称为子模块或子项目)继承这个父POM的配置,即让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作。

父POM

父POM是一个Maven项目,它在<packaging>元素中指定为pom,表示这是一个POM项目,不产生任何构建输出(如jar、war等)。父POM中定义的内容可以被其子模块继承。

子模块

子模块是那些继承自父POM的Maven项目。在父POM的目录下,通常会有一个modules元素,列出所有子模块的路径(相对于父POM的路径)。这样,Maven就能够知道哪些项目应该被视为父项目的子模块。

2.继承机制

当Maven处理一个项目时,它会首先查找该项目的父POM(通过<parent>元素指定),然后合并父POM中的配置到当前项目的POM中。合并时,如果当前项目的POM中有与父POM相同的元素,那么当前项目的配置会覆盖父POM中的配置。

3.示例

假设我们有一个父POM parent-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>  <groupId>com.example</groupId>  <artifactId>parent-project</artifactId>  <version>1.0-SNAPSHOT</version>  <packaging>pom</packaging>  <modules>  <module>child-module1</module>  <module>child-module2</module>  </modules>  <dependencies>  <!-- 公共依赖 -->  <dependency>  <groupId>junit</groupId>  <artifactId>junit</artifactId>  <version>4.13.2</version>  <scope>test</scope>  </dependency>  </dependencies>  <!-- 其他配置... -->  
</project>

  子模块child-module1pom.xml可以像这样继承父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>  <groupId>com.example</groupId>  <artifactId>parent-project</artifactId>  <version>1.0-SNAPSHOT</version>  </parent>  <artifactId>child-module1</artifactId>  <!-- 子模块特有的配置 -->  
</project>

在这个例子中,child-module1继承了parent-project中定义的依赖和配置,并且可以添加或覆盖特定的配置。

4.继承作用

作用:在父工程中统一管理项目中的依赖信息,进行统一版本管理!

背景

1.对一个比较大型的项目进行了模块拆分。
2.一个 project 下面,创建了很多个 module。
3.每一个 module 都需要配置自己的依赖信息。

需求

1.多个模块要便用同一个框架,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一管理,
2.使用框架时所需要的jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。

5.注意事项

  • 父POM的<packaging>必须是pom
  • 子模块需要在父POM的<modules>部分中声明。
  • Maven处理继承时,会首先读取父POM,然后读取子POM,并将子POM中的配置与父POM合并。
  • 子POM可以覆盖父POM中的配置,但不能删除父POM中定义的配置(除非使用特定的Maven插件或技巧)

Maven聚合关系

Maven的聚合关系是一种项目管理和构建方式,它允许将多个相关的Maven项目组合成一个构建单元,从而简化多模块项目的构建过程,提高构建效率。

1. 定义与概念

  • 聚合:在Maven中,聚合是指将多个模块(或项目)组合成一个完整项目的功能。这些模块可以是独立的库、应用程序或任何其他类型的项目。通过聚合,可以将相关的模块组织在一起,并在一个中央构建过程中构建它们。

2. 实现方式

  • 父POM文件:在Maven中,聚合关系是通过在父POM文件中使用<modules>元素来定义的。父POM文件指定了哪些子模块应该被包含在聚合中。每个子模块都有自己的POM文件和源代码目录结构。
  • 子模块:子模块是具体的项目或模块,它们依赖于父POM文件定义的公共属性和配置。在父POM文件的<modules>元素中,列出了所有要聚合的子模块的路径和名称。

3. 特性与优势

  • 简化构建过程:通过聚合,可以在一个命令中构建和发布多个相关的项目,从而简化了部署和维护工作。
  • 优化构建顺序:聚合允许对多个项目进行顺序控制,确保依赖关系得到正确处理,避免出现构建依赖混乱导致构建失败的情况。
  • 统一配置管理:父POM文件可以定义公共的配置信息,如依赖管理、插件配置等,子模块可以继承这些配置,避免了重复配置和维护的开销。

4. 示例

假设有一个包含两个子模块(module1和module2)的父项目(parent-project)。在父项目的POM文件中,可以通过以下方式定义聚合关系:

<project>  <modelVersion>4.0.0</modelVersion>  <groupId>com.example</groupId>  <artifactId>parent-project</artifactId>  <version>1.0.0</version>  <packaging>pom</packaging>  <modules>  <module>module1</module>  <module>module2</module>  </modules>  <!-- 父项目的其他配置 -->  
</project>

在子模块的POM文件中,可以通过<parent>元素指定父项目的坐标,以继承父项目的配置: 

<project>  <modelVersion>4.0.0</modelVersion>  <parent>  <groupId>com.example</groupId>  <artifactId>parent-project</artifactId>  <version>1.0.0</version>  </parent>  <artifactId>module1</artifactId>  <packaging>jar</packaging>  <!-- 子模块的其他配置 -->  
</project>

5. 注意事项

  • 聚合的父POM文件通常不包含实际的代码或资源,而是作为一个模板或基础配置,供其他项目继承使用。
  • 子模块需要位于父POM文件指定的路径下,以便Maven能够正确识别和处理它们。
  • 聚合和继承在Maven中经常一起使用,以提供更强大和灵活的项目管理和构建支持。然而,它们是不同的概念,聚合关注的是项目的组合方式,而继承关注的是配置信息的重用。

结束 


http://www.ppmy.cn/embedded/97450.html

相关文章

原型与原型链与继承

原型、原型链与继承 构造函数 构造函数创建实例的过程 1.创建一个新对象 2.将空对象的__proto__指向构造函数的原型 3.修改构造函数中this指向&#xff0c;将构造函数中的this指向实例对象&#xff0c;执行构造函数中的代码&#xff0c;给这个新对象添加属性和方法&#x…

【Hot100】LeetCode—56. 合并区间

目录 1- 思路贪心 2- 实现⭐56. 合并区间——题解思路 3- ACM 实现 原题连接&#xff1a;56. 合并区间 1- 思路 贪心 1- 先对数组根据首元素排序2- 遍历数组&#xff0c;根据 left 和 right 维护一个左右区间。判断是否重叠 不重叠&#xff1a;收集结果重叠&#xff1a;更新 r…

Linux VSFTP 部署与配置

一、VSFTP 简介与应用 VSFTP&#xff08;Very Secure FTP Daemon&#xff09;是一款功能强大、安全可靠的FTP服务器软件&#xff0c;广泛应用于Linux/Unix系统中。它提供了高效的文件传输服务&#xff0c;并具备诸多安全特性&#xff0c;如用户认证、权限控制、SSL/TLS加密等。…

HarmonyOS布局详解:掌握线性布局中的Row与Column

概述 线性布局&#xff08;LinearLayout&#xff09;是开发中最常用的布局&#xff0c;通过线性容器 Row 和 Column 构建。线性布局是其他布局的基础&#xff0c;其子元素在主轴方向&#xff08;水平方向或垂直方向&#xff09;依次排列。根据排列方向的不同&#xff0c;开发者…

什么是BERT?工程快速入门

基本介绍 全称是Bidirectional Encoder Representations from Transformers。BERT翻译成中文通常被称为“双向编码器表征法”或简单地称为“双向变换器模型” Bidirectional&#xff1a;是双向神经网络&#xff0c;这个在学习 RNN 时候我们就了解到如何使用双向 RNN 让每一个…

ffmpeg实现mvk到mp4的格式转换

本文记录在使用ffmpeg转换mkv格式的文件到mp4时的一些问题. 像素格式问题 常规的转换命令可能如下 ffmpeg -i input.mkv -c:v libx264 -c:a aac output.mp4这里用libx264进行视频编码,aac进行音频编码&#xff0c;按道理是有很好的通用性的&#xff0c;但是笔者多次在转换后…

html+css网页设计 淘宝登录页面

htmlcss网页设计 淘宝登录页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xff0c;访…

机器人等方向学习和研究的目标

核心目标类似&#xff1a; 学习一个知识点用时越来越短&#xff0c;研究一个系统效率越来越高。 目标 没有目标是常态&#xff0c;十分普遍。 但其实&#xff0c;目标也可以很宽泛。 感谢朋友们一直以来的鼓励帮助&#xff0c;倍感荣幸&#xff0c;非常感谢。-CSDN blink-…