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

08Maven中的继承和聚合的作用

Maven中的继承

实际开发中对一个比较大型的项目进行了模块拆分 , 一个project下面创建了很多个modul, 每一个module都需要配置自己的依赖信息

  • 开发中使用的同一个框架内的不同jar包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一

传统方式: 在每一个module中各自维护各自的依赖信息, 这样很容易发生出入导致jar包的版本不易统一管理

  • 确定使用框架时项目所需要的jar包组合(或者说依赖信息组合)需要经过长期摸索和反复调试耗费很大精力

Maven工程之间,A(子)工程继承B(父)工程 , 本质上是A工程的pom.xml中的配置继承了B工程中pom.xml的配置

  • 一般在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本
  • 子工程就可以不用指定依赖的版本号 , 但必须往上可以追溯到一个父工程指定了依赖的版本号(不限于直接父工程)
  • 一处修改处处生效 : 在父工程中将依赖信息的版本进行升级, 相应的所有子工程中依赖的版本号也会升级

编写一套符合要求、开发各种功能都能正常工作的依赖组合并不容易, 如果有人总结了成熟的组合方案,那么再开发新项目时就可以使用工程继承的机制

  • 公司级的父工程中管理的就是保留下来的成熟的依赖组合方案,各个新项目、子系统各取所需即可,极大的提高了效率
  • 通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范准确的 jar包, 又能够将以往的经验沉淀下来,节约时间和精力

在这里插入图片描述

依赖版本管理

需求: 在一个工程中需要依赖多个Spring框架的jar包 , 要求工程中所有jar包的版本必须一致

[INFO] +- org.springframework:spring-core:jar:4.0.0.RELEASE:compile
[INFO] | \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] +- org.springframework:spring-beans:jar:4.0.0.RELEASE:compile
[INFO] +- org.springframework:spring-context:jar:4.0.0.RELEASE:compile
[INFO] +- org.springframework:spring-expression:jar:4.0.0.RELEASE:compile
[INFO] +- org.springframework:spring-aop:jar:4.0.0.RELEASE:compile
[INFO] | \- aopalliance:aopalliance:jar:1.0:compile

第一步: 创建父工程pro03-maven-parent(工程中不写业务代码), 要修改它的打包方式为pom , 表示它是专门管理其他Maven工程的工程

<?xml version="1.0" encoding="UTF-8"?>
<!--project跟标签,表示对当前工程进行配置管理-->
<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标签:代表当前pom.xml所采用的标签结构,从Maven2开始就固定是4.0.0--><modelVersion>4.0.0</modelVersion>  <groupId>com.atguigu.maven</groupId><artifactId>pro03-maven-parent</artifactId><version>1.0-SNAPSHOT</version><!--当前工程作为父工程,它要去管理子工程,所以打包方式必须是pom--><packaging>pom</packaging><!--当前工程的名字--><name>pro03-maven-parent</name><!--maven的官网地址--><url>http://maven.apache.org</url><properties><!--工程构建过程中读取源码时使用的字符集--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>

第二步: 创建子模块工程似于IDEA中的module, 需要进入pro03-maven-parent工程的根目录下运行mvn archetype:generate 命令来创建模块工程

  • 创建完子模块工程后发现父工程pom.xml配置文件多了modules和module标签(聚合功能的配置)
  • 子工程的pom.xml配置文件多了parent标签用来指定当前工程的父工程坐标
  • 如果子工程引入依赖的jar包坐标中的groupId或version与父工程一致,那么可以省略groupId或version
<!--总工程中聚合的配置-->
<modules>  <module>pro04-maven-module</module><module>pro05-maven-module</module><module>pro06-maven-module</module>
</modules>
<!--使用parent标签指定当前工程的父工程-->
<parent><!--通过指定父工程的坐标找到父工程 --><groupId>com.atguigu.maven</groupId><artifactId>pro03-maven-parent</artifactId><version>1.0-SNAPSHOT</version>
</parent><!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略它-->
<!-- <groupId>com.atguigu.maven</groupId> -->
<!-- <version>1.0-SNAPSHOT</version> -->
<artifactId>pro04-maven-module</artifactId>

第三步: 在父工程中使用dependencyManagement标签对依赖的版本号进行统一管理

  • 被父工程管理的依赖并没有真正被引入到工程,子工程需要使用的依赖还需要手动配置到工程中但依赖信息可以不写版本号
  • 如果子工程配置了依赖的版本号则以当前子工程的版本号为准(就近原则),一般子工程还是遵从父工程统一管理的依赖
<dependencyManagement><dependencies><!--父工程管理的依赖并没有真正被引入到工程--><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>4.0.0.RELEASE</version></dependency></dependencies>
</dependencyManagement>

第四步: 子工程中引用那些被父工程管理的依赖可以省略版本号, 表示子工程中这个依赖的版本由父工程的dependencyManagement决定

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId></dependency>
</dependencies>

在父工程中声明自定义属性

在父工程的properties标签内创建自定义属性标签用来统一指定依赖的版本,标签名即属性名,标签值即属性值

<!--自定义属性标签-->
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!--创建自定义的属性标签--><atguigu.spring.version>4.3.6.RELEASE</atguigu.spring.version>
</properties>

通过${属性名}引用属性表达式的方式设定依赖的版本号, 这样所有的版本号就成了一个动态值,只有修改标签属性值相应的引用属性值的地方都会修改

<dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><!--引用自定义的属性名--><version>${atguigu.spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><!--引用自定义的属性名--><version>${atguigu.spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><!--引用自定义的属性名--><version>${atguigu.spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><!--引用自定义的属性名--><version>${atguigu.spring.version}</version></dependency></dependencies>
</dependencyManagement>

Maven中的聚合

模块部分组成项目整体: 使用一个“总工程”将各个“模块工程”汇集起来,作为一个整体对应完整的项目

  • 从继承关系角度来看:父工程和子工程
  • 从聚合关系角度来看:总工程和模块工程

依赖循环: 如果A工程依赖B工程,B 程依赖C工程,C工程又反过来依赖A工程,那么在执行构建操作时会出现循环引用的错误

聚合的作用

Maven执行命令时要求有父工程时先安装父工程 , 有依赖的工程时,先安装被依赖的工程 , 工程聚合后执行命令时会自动按照正确的顺序执行

  • 工程聚合之后可以一键执行Maven命令, 很多构建命令都可以在“总工程”中一键执行,如执行mvn install命令可以一键完成安装
  • 在总工程配置聚合之后,各个模块工程会在总工程中展示一个列表,让项目中的各个模块一目了然
<!--在总工程/父工程pro03-maven-module中配置modules-->
<!--假设04依赖05,05依赖06(注意依赖循环问题),执行mvn install命令时安装顺序是03,06,05,04---->
<modules>  <module>pro04-maven-module</module><module>pro05-maven-module</module><module>pro06-maven-module</module>
</modules>

相关文章:

08Maven中的继承和聚合的作用

Maven中的继承 实际开发中对一个比较大型的项目进行了模块拆分 , 一个project下面创建了很多个modul, 每一个module都需要配置自己的依赖信息 开发中使用的同一个框架内的不同jar包&#xff0c;它们应该是同一个版本&#xff0c;所以整个项目中使用的框架版本需要统一 传统方…...

Ansible运行临时命令及常用模块介绍

目录 一.运行临时命令 1.基本语法格式 2.查看当前版本已安装的所有模块 二.ansible常见模块 1.command模块 2.shell模块 3.raw模块 4.script模块 5.file模块 参数列表&#xff1a; 示例&#xff1a; 6.copy模块 参数列表&#xff1a; 示例&#xff1a; 7.fetch模…...

EtherCAT报文-APRD(自动增量读)抓包分析

0.工具准备 1.EtherCAT主站 2.EtherCAT从站&#xff08;本文使用步进电机驱动器&#xff09; 3.Wireshark1.EtherCAT报文帧结构 EtherCAT使用标准的IEEE802.3 Ethernet帧结构&#xff0c;帧类型为0x88A4。EtherCAT数据包括2个字节的数据头和44-1498字节的数据。数据区由一个或…...

论文阅读:Seeing in Extra Darkness Using a Deep-Red Flash

论文阅读&#xff1a;Seeing in Extra Darkness Using a Deep-Red Flash 今天介绍的这篇文章是 2021 年 ICCV 的一篇 oral 文章&#xff0c;主要是为了解决极暗光下的成像问题&#xff0c;通过一个深红的闪光灯补光。实现了暗光下很好的成像效果&#xff0c;整篇文章基本没有任…...

将license验证加入到系统中

1.将ClientDemo下的cn文件夹的内容导入项目对应的java目录下。 2.将license-config.properties文件导入resources目录下。 3.在项目的pom.xml中添加如下依赖。 <properties><!-- Apache HttpClient --><httpclient>4.5.5</httpclient><!-- License…...

中断机制-interrupt和isInterrupted源码分析、中断协商案例

当前线程的中断标识为true&#xff0c;是不是线程就立刻停止&#xff1f; 答案是不立刻停止&#xff0c;具体来说&#xff0c;当对一个线程&#xff0c;调用interrupt时&#xff1a; 如果线程处于正常活动状态&#xff0c;那么会将该线程的中断标志设置为true&#xff0c;仅此…...

我与COSCon的故事【时光的故事】

曾经 2019年的时候&#xff0c;我还在日本读研究生&#xff0c;做一些物联网 (Internet of Things, IoT) 网络中的底层P2P (Peer to Peer) 通讯仿真模拟。这个方向是新来的Nguyen老师的新方向&#xff0c;它跟计算机强相关&#xff0c;但是很小众&#xff0c;实验室里也没有前辈…...

【科学文献计量】利用pybibx分析Scopus文献数据集(EDA,N-Grams,Cluster,Network analysis,NLP)

利用pybibx分析Scopus文献数据集 1 运行前准备1.1 数据集1.2 前置库2 加载库3 数据导入4 探索式数据分析,即EDA4.1 表格可视化4.2 词云图可视化4.3 N-Grams可视化4.4 文献聚类4.5 主题词演化4.6 桑基图可视化4.7 树图可视化4.8 作者生产力可视化5 网络可视化5.1 文献引用与被引…...

-带你看懂11种API类型及应用-

一起走进多样的API&#xff0c;多样的精彩 随着互联网行业的日益发展&#xff0c;API(Application Programming Interface)这个名词对于绝大多数来说都已不再陌生。然而&#xff0c;实际上&#xff0c;根据不同标准可以划分出不同类型的API。今天&#xff0c;让我们来走…...

集成友盟qq互联分享,导出风险问题处理

处理方案&#xff1a;移除 android:exported"true"即可。 注意友盟SDK QQ share 里默认配置是android:exported"true"&#xff0c;所以要覆盖即可。...

探索数字安全的卓越之选 - Digicert证书

在数字时代&#xff0c;数据安全和隐私保护变得尤为重要。无论是个人网站、电子商务平台还是大型企业&#xff0c;保护用户数据和建立信任都是至关重要的任务。在这个领域&#xff0c;Digicert是一个备受推崇的品牌&#xff0c;提供了卓越的数字证书解决方案&#xff0c;以确保…...

第五章 流程控制 Pro

五、流程控制 1、条件语句 一、if语句&#xff08;三种形式&#xff09; 1、单分支语句: if &#xff08;表达式&#xff09;语句&#xff1b; //表达式可以是任何表达式 0和非0 多条语句加{ }构成复合语句 2、双分支语句 if(表达式) 语句1&#xff1b; else 语句2…...

CSS之实现线性渐变背景

1. background: linear-gradient() background: linear-gradient是CSS中用于创建线性渐变背景的属性&#xff0c;这个属性允许你定义一个在元素的背景中进行渐变的效果&#xff0c;可以从一个颜色过渡到另一个颜色。 基本语法 background: linear-gradient(direction, color-…...

软考 系统架构设计师系列知识点之特定领域软件体系结构DSSA(7)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之特定领域软件体系结构DSSA&#xff08;6&#xff09; 所属章节&#xff1a; 第7章. 系统架构设计基础知识 第5节. 特定领域软件体系结构 相关试题 5. 特定领域软件架构&#xff08;Domain Specific Software Archite…...

CentOS-7网卡重启后关闭的解决方法

第一步查找网卡&#xff1a; ip addr 如下图&#xff1a; 于是发现网卡eth0。 第二步进入网卡配置目录并进行配置&#xff1a; cd /etc/sysconfig/network-scriptsvim ifcfg-eth0 第三步改配置如下图&#xff1a; 然后每次重启后网卡会自动启动。...

Linux CentOS7 用户组管理

Linux操作系统基于多用户的设计理念&#xff0c;允许多个用户同时使用系统资源。用户是登录系统并使用系统资源的个体&#xff0c;其都有自己的账户和密码。用户组是将众多用户归类为一组。Linux中的用户和用户组是系统安全和权限管理的基础。本文将探讨Linux中用户组的创建和管…...

C++算法:前缀和基础

相关 源码测试用例下载 https://download.csdn.net/download/he_zhidan/88430716 包括4个压缩包&#xff0c;初始代码&#xff0c;实现前缀和&#xff0c;实现前缀积&#xff0c;实现前缀异或。都是在前者的基础上修改的。 本博文是CSDN学院课程的讲义 https://edu.csdn.net/c…...

vue和react的区别

目录 1. 数据绑定 Vue React 2. 组件化 Vue React 3. 学习曲线 4. 状态管理 Vue React 5. 社区和生态系统 3. 学习曲线 4. 状态管理 Vue React 5. 生态系统 6. 社区和支持 7. 性能 8. 生产环境性能 9.语法和模板: 结论 当涉及到前端开发框架时&#xff0c…...

STM32 之 HAL 库串口 USART 丢数据及ORE卡死的解决方案

STM32 之 HAL 库串口 USART 丢数据及ORE卡死的解决方案_hal_uart_error_ore-CSDN博客...

递归最小二乘法RLS

参考&#xff1a;RLS递归最小二乘法(Recursive Least Squares)_hymwgk的博客-CSDN博客...

电光非线性计算加速Transformer注意力机制

1. 电光非线性计算加速Transformer注意力机制的技术背景Transformer架构已经成为当前自然语言处理和计算机视觉领域的主导性神经网络结构&#xff0c;其核心组件——注意力机制依赖于Softmax等非线性运算。虽然这些非线性操作仅占模型总计算量的不到1%&#xff0c;但由于现代GP…...

如何实现Airbyte动态服务发现:从基础到实践的完整指南

如何实现Airbyte动态服务发现&#xff1a;从基础到实践的完整指南 【免费下载链接】airbyte Open-source data movement for ELT pipelines and AI agents — from APIs, databases & files to warehouses, lakes, and AI applications. Both self-hosted and Cloud. 项目…...

Python自动化红头文件生成:ReportLab与Jinja2技术实践

1. 项目概述&#xff1a;一个自动化的红头文件生成工具 最近在整理一些行政和项目文档时&#xff0c;经常需要处理格式要求极为严格的“红头文件”。这类文件通常用于正式通知、公告或批复&#xff0c;其版头、字体、字号、间距乃至印章位置都有近乎刻板的规定。手动在Word里调…...

中文知识管理利器:本地化部署与向量检索实践指南

1. 项目概述&#xff1a;一个面向中文用户的知识管理利器 最近在折腾个人知识库&#xff0c;发现了一个挺有意思的开源项目&#xff0c;叫 RomeoSY/zh-knowledge-manager 。乍一看名字&#xff0c;你可能觉得这又是一个“知识管理”工具&#xff0c;市面上不是有 Notion、Ob…...

Cortex-R52 MBIST与March算法在嵌入式存储测试中的应用

1. Cortex-R52 MBIST测试技术解析在嵌入式系统开发中&#xff0c;存储器可靠性直接影响整个系统的稳定性。作为Arm Cortex-R系列中的实时处理器&#xff0c;Cortex-R52集成了PMC-R52&#xff08;Programmable Memory Controller&#xff09;模块&#xff0c;专门用于执行存储器…...

iPhone 5s系统工程解析:LPDDR3内存与E2NAND存储的协同进化

1. 项目概述&#xff1a;iPhone 5s&#xff0c;一场被低估的系统性工程胜利2013年9月&#xff0c;当苹果发布iPhone 5s时&#xff0c;聚光灯几乎全部打在了那个划时代的64位A7处理器上。媒体和消费者的讨论都围绕着“桌面级性能”和“移动计算新时代”展开。作为一名在消费电子…...

语言启蒙到底要不要背单词

语言启蒙阶段到底要不要背单词&#xff1f;我更愿意把这个问题换一种问法&#xff1a;这些词是不是能和声音、图像、语境连起来&#xff0c;并且隔几天还能回来一次。 如果只是拿一张词表硬记&#xff0c;入门用户很容易觉得枯燥。可如果完全不接触词汇&#xff0c;后面的听读…...

光子储层计算在无人机动态补偿中的创新应用

1. 深度光子储层计算在无人机动态补偿中的创新应用在无人机控制领域&#xff0c;传统PID控制器面对复杂流体环境时往往力不从心。当无人机在狭窄空间或近地面飞行时&#xff0c;地面效应、天花板效应以及湍流再循环等未建模动力学因素会导致显著的性能下降。我在参与某城市峡谷…...

2026届学术党必备的六大降重复率平台推荐榜单

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 令AI精确执行任务的基础&#xff0c;是下达精准的指令&#xff0c;此即降AI指令。降AI指令专…...

Python网络爬虫实战:构建自动化招聘信息聚合工具JobClaw

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫 JobClaw。这名字起得挺形象&#xff0c;“Claw”是爪子的意思&#xff0c;合起来就是“工作抓取器”。简单来说&#xff0c;它是一个帮你从各大招聘网站上自动抓取、聚合和分析职位信息的工具。对于正在找…...