当前位置: 首页 > news >正文

Maven继承和聚合特性

目录

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中经常一起使用,以提供更强大和灵活的项目管理和构建支持。然而,它们是不同的概念,聚合关注的是项目的组合方式,而继承关注的是配置信息的重用。

结束 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • docker部署nginx--(部署静态文件和服务)
  • 【分布式系统】关于主流的几款分布式链路追踪工具
  • 深入认识微信小程序openid
  • 项目启动端口报冲突如何处理?
  • 编码器精度
  • Go 语言开发工具
  • Linux(面试篇)
  • 【Python机器学习】NLP——一个简陋的聊天机器人
  • yum 数据源的切换
  • gpt-2语言模型训练
  • 揭秘!移动安全管理系统是什么?有什么功能?(从小白到精通一文揭晓!)
  • java在实际开发中反常识bug
  • 阿里一款非常不错的多级缓存框架如何使用?
  • Nmap扫描六种端口状态介绍
  • 【java计算机毕设】足浴城消费系统小程序MySQL ssm vue uniapp maven项目设计源代码 编程语言 小组课后作业 寒暑假作业
  • @angular/forms 源码解析之双向绑定
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Git同步原始仓库到Fork仓库中
  • Hibernate最全面试题
  • JavaScript 基础知识 - 入门篇(一)
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • MySQL用户中的%到底包不包括localhost?
  • Python利用正则抓取网页内容保存到本地
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 浮现式设计
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 学习Vue.js的五个小例子
  • 一份游戏开发学习路线
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (3)(3.5) 遥测无线电区域条例
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (十)c52学习之旅-定时器实验
  • (转载)虚函数剖析
  • ****Linux下Mysql的安装和配置
  • *Django中的Ajax 纯js的书写样式1
  • .Net 4.0并行库实用性演练
  • .Net 6.0--通用帮助类--FileHelper
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net6+aspose.words导出word并转pdf
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ Python ]使用Charles对Python程序发出的Get与Post请求抓包-解决Python程序报错问题
  • []串口通信 零星笔记
  • [Bugku]密码???[writeup]