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

Maven(六):Maven的使用——继承与聚合

Maven(六):Maven的使用——继承与聚合

  • 前言
  • 一、实验九:继承
    • 1、概念
    • 2、作用
    • 3、举例
    • 4、操作
      • 4.1 创建父工程
      • 4.2 创建模块工程
      • 4.3 查看被添加新内容的父工程 pom.xml
      • 4.4 解读子工程的pom.xml
      • 4.5 在父工程中配置依赖的统一管理
      • 4.6 子工程中引用那些被父工程管理的依赖
      • 4.7 在父工程中升级依赖信息的版本
      • 4.8 在父工程中声明自定义属性
    • 5、实际意义
  • 二、实验十:聚合
    • 1、聚合本身的含义
    • 2、Maven 中的聚合
    • 3、好处
    • 4、聚合的配置
    • 5、依赖循环问题

前言

本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!



一、实验九:继承

1、概念

Maven工程之间,A 工程继承 B 工程

B 工程:父工程
A 工程:子工程
本质上是 A 工程的 pom.xml 中的配置继承了 B 工程中 pom.xml 的配置。

2、作用

在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本

它的背景是:

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

它背后的需求是:

⭕ 在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。
⭕ 使用同一个框架内的不同 jar包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。

⭕ 使用框架时所需要的 jar包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。

通过在父工程中为整个项目维护依赖信息的组合既保证了整个项目使用规范、准确的 jar 包;又能够将以往的经验沉淀下来,节约时间和精力。

3、举例

在一个工程中依赖多个 Springjar

TIP

[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

使用 Spring 时要求所有 Spring 自己的 jar 包版本必须一致。为了能够对这些 jar 包的版本进行统一管理,我们使用继承这个机制,将所有版本信息统一在父工程中进行管理。

4、操作

4.1 创建父工程

创建的过程和前面创建 pro01-maven-java 一样。
工程名称:pro03-maven-parent
工程创建好之后,要修改它的打包方式:

 <groupId>com.atguigu.maven</groupId><artifactId>pro03-maven-parent</artifactId><version>1.0-SNAPSHOT</version><!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom --><packaging>pom</packaging>

只有打包方式为 pomMaven 工程能够管理其他 Maven 工程。打包方式为 pomMaven 工程中不写业务代码,它是专门管理其他 Maven 工程的工程

4.2 创建模块工程

模块工程类似于 IDEA 中的 module,所以需要进入 pro03-maven-parent 工程的根目录,然后运行 mvn archetype:generate 命令来创建模块工程。

假设,我们创建三个模块工程:

在这里插入图片描述

4.3 查看被添加新内容的父工程 pom.xml

下面 modulesmodule 标签是聚合功能的配置

<modules>  <module>pro04-maven-module</module><module>pro05-maven-module</module><module>pro06-maven-module</module>
</modules>

4.4 解读子工程的pom.xml

<!-- 使用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> -->
<artifactId>pro04-maven-module</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->

4.5 在父工程中配置依赖的统一管理

<!-- 使用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>

4.6 子工程中引用那些被父工程管理的依赖

关键点:省略版本号

<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。	-->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
<!-- 具体来说是由父工程的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>

4.7 在父工程中升级依赖信息的版本

……<dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.1.4.RELEASE</version></dependency>
……

然后在子工程中运行mvn dependency:list,效果如下:

TIP

[INFO] org.springframework:spring-aop:jar:4.1.4.RELEASE:compile
[INFO] org.springframework:spring-core:jar:4.1.4.RELEASE:compile
[INFO] org.springframework:spring-context:jar:4.1.4.RELEASE:compile
[INFO] org.springframework:spring-beans:jar:4.1.4.RELEASE:compile
[INFO] org.springframework:spring-expression:jar:4.1.4.RELEASE:compile

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

<!-- 通过自定义属性,统一指定Spring的版本 -->
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- 自定义标签,维护Spring版本数据 --><atguigu.spring.version>4.3.6.RELEASE</atguigu.spring.version>
</properties>

在需要的地方使用${}的形式来引用自定义的属性名:

	<dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${atguigu.spring.version}</version></dependency>

真正实现“一处修改,处处生效”。

5、实际意义

在这里插入图片描述

编写一套符合要求、开发各种功能都能正常工作的依赖组合并不容易。如果公司里已经有人总结了成熟的组合方案,那么再开发新项目时,如果不使用原有的积累,而是重新摸索,会浪费大量的时间。为了提高效率,我们可以使用工程继承的机制,让成熟的依赖组合方案能够保留下来。

如上图所示,公司级的父工程中管理的就是成熟的依赖组合方案,各个新项目、子系统各取所需即可。

二、实验十:聚合

1、聚合本身的含义

部分组成整体

在这里插入图片描述

动画片《战神金刚》中的经典台词:“我来组成头部!我来组成手臂!”就是聚合关系最生动的体现。

2、Maven 中的聚合

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

概念的对应关系:

⭕ 从继承关系角度来看:

父工程 子工程

⭕ 从聚合关系角度来看:

总工程 模块工程

3、好处

⭕ 一键执行 Maven 命令:很多构建命令都可以在“总工程”中一键执行。

mvn install 命令为例:Maven要求有父工程时先安装父工程;有依赖的工程时,先安装被依赖的工程。我们自己考虑这些规则会很麻烦。但是工程聚合之后,在总工程执行 mvn install 可以一键完成安装,而且会自动按照正确的顺序执行。

⭕ 配置聚合之后,各个模块工程会在总工程中展示一个列表,让项目中的各个模块一目了然。

4、聚合的配置

在总工程中配置 modules 即可:

<modules>  <module>pro04-maven-module</module><module>pro05-maven-module</module><module>pro06-maven-module</module></modules>

5、依赖循环问题

如果 A 工程依赖 B 工程,B 工程依赖 C 工程,C 工程又反过来依赖 A 工程,那么在执行构建操作时会报下面的错误:

[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:

这个错误的含义是:循环引用。

相关文章:

Maven(六):Maven的使用——继承与聚合

Maven&#xff08;六&#xff09;&#xff1a;Maven的使用——继承与聚合 前言一、实验九&#xff1a;继承1、概念2、作用3、举例4、操作4.1 创建父工程4.2 创建模块工程4.3 查看被添加新内容的父工程 pom.xml4.4 解读子工程的pom.xml4.5 在父工程中配置依赖的统一管理4.6 子工…...

Java ---System类

System 类位于 java.lang 包&#xff0c;代表当前 Java 程序的运行平台&#xff0c;系统级的很多属性和控制方法都放置在该类的内部。由于该类的构造方法是 private 的&#xff0c;所以无法创建该类的对象&#xff0c;也就是无法实例化该类。 System 类提供了一些类变量和类方…...

代码随想录_贪心_leetcode 406 452

leetcode 406. 根据身高重建队列 406. 根据身高重建队列 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高…...

C++类的静态成员详解:成员函数非静态成员函数的非法调用

在C中&#xff0c;静态成员是属于整个类的而不是某个对象&#xff0c;静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则&#xff0c;保证了安全性还可以节省内存。 静态成员的定义或声明要…...

Qt之滑动条和进度条(QSlider、QProgressBar)

文章目录 前言一、QSliderQSlider的常用API信号与槽 二、QProgressBar滑动条和滚动条的常用API 总结 前言 在用户界面设计中&#xff0c;滑动条和进度条是常见的控件。Qt中提供了QProgressBar和QSlider两个类来实现滚动条和滑动条。 一、QSlider 在Qt中&#xff0c;QSlider是…...

Flutter之插件开发plugin

目的:适用于独立业务模块,或者与原生页面交互频繁的地方。 基于flutter3.x , IDE :androidStudio demo:https://download.csdn.net/download/SHTLoveXX/87751845​​​​​​​ 步骤: 1.新建flutter project 【New flutter project】. 2. 在新建工程面板记得切换 …...

asp.net基于web的音乐管理网站dzkf17A9程序

本系统主要包含了等系统用户管理、公告信息管理、音乐资讯管理、音乐类型管理多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块&#xff1a;管理员登录系统对本系统其他管理模块进行管理。 用户的登录模块&#xff1a;用户登录本系统&#xff0c;对个…...

itop-3568开发板驱动学习笔记(25)设备树(四)GPIO 实例分析

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 GPIO 控制器必要属性其他属性 指定 GPIO 引脚 和时钟类似&#xff0c;GPIO 在设备树中也存在两层定义&#xff0c;首先是 GPIO 控制器&#xff0c;这部分由芯片原厂工程师编写&#xff0c;相当于 GPIO 底层…...

函数(定义、返回值、调用、参数)

目录 ❤ 无参函数 ❤ 有参函数 ❤ 空函数 ❤ 什么是返回值&#xff1f; ❤ 为什么要有返回值&#xff1f; ❤ 什么是函数调用&#xff1f; ❤ 为何用调用函数&#xff1f; ❤ 函数调用的三种形式 ❤ 形参和实参 形参 实参 ❤ 位置参数 位置形参 位置实…...

28. Kubernetes 核心组件讲解——API Server

本章讲解知识点 Kubernetes API Server 概述etcd 简介API Server 架构解析API Server 的 List-Watch 机制独特的 Kubernetes Proxy API 接口集群功能模板之间的通信1. Kubernetes API Server 概述 1.1 基本概念 Kubernetes API Server(API Server)是 Kubernetes 的核心组件…...

springboot框架开发医院云HIS 住院医生站、住院护士站功能实现

住院医生站主模块&#xff1a;包括医嘱管理、病案首页、分配入科、住院清单、我的质控等子模块 &#xff08;1&#xff09;医嘱管理功能简介 ①住院患者开立医嘱、支持医嘱复制、停止、作废等操作&#xff1b; ②医嘱类型含药品、项目、材料、嘱托&#xff1b; ③支持住院各…...

高性能定时器介绍及代码逐行解析--时间堆

简介 在《Linux高性能服务器编程》中&#xff0c;介绍了三种定时方法&#xff1a; socket选项SO_RCVTIMEO和SO_SNDTIMEOSIGALRM信号I/O复用系统调用的超时参数 基础知识 非活跃&#xff0c;是指客户端&#xff08;这里是浏览器&#xff09;与服务器端建立连接后&#xff0c…...

汇编语言学习笔记五

div指令 除法&#xff0c; 被除数&#xff1a;默认是放在ax或者dx中&#xff0c;其位数为16位&#xff0c;则在ax中&#xff0c;如位数为32位&#xff0c;则高位在dx中&#xff0c;低位在ax中 除数&#xff1a;放在寄存器或者内存单元中&#xff0c;有8位和16位两种。 结果&am…...

Linux下的epf 是什么?

EPF (Extended Page Frame) 是 Linux 内核中的一个功能&#xff0c;它用于管理大内存系统中的物理页框。具体来说&#xff0c;当系统中的物理内存超过 1TB 时&#xff0c;传统的页表结构会变得非常庞大和复杂&#xff0c;给内存管理带来很大的困难。 EPF 架构通过将物理地址分…...

如何在广告形式选择上化解用户厌恶和变现瓶颈?

​用户讨厌广告&#xff0c;这似乎是一个共识。在日复一日的使用中&#xff0c;用户会遇到各种各样的广告形式&#xff0c;从搜索结果中的广告链接&#xff0c;到视频中不间断的广告&#xff0c;再到流行应用中的推广内容。 无处不在的广告已经让用户不胜其烦&#xff0c;这也…...

【Android入门到项目实战-- 9.2】—— 传感器实战使用教程(靠近黑屏和计步器)

上篇文章介绍了传感器的基础用法&#xff08;如有需要&#xff0c;可先移步&#xff09;&#xff0c;下面将通过两个实战案例学习具体如何使用。 一、靠近黑屏 这是距离传感器的简单应用。 –检测手机是否贴在耳朵上正在打电话&#xff0c;以便自动熄灭屏幕达到省电的目的。也…...

软件项目生命周期模型

目录 瀑布模型 快速原型模型 敏捷模型 迭代模型&#xff08;增量模型&#xff09; 螺旋模型 瀑布模型 定义&#xff1a;早就计划好了&#xff0c;按计划顺序&#xff08;计划、设计、开发、测试、维护&#xff09;线性执行 适用于&#xff1a;需求明确、变化少的项目 缺…...

linux系统TP-ti,tsc2046外设调试

一、整体调试思路 tp外设属于比较常见且比较简单的外设&#xff0c;今天以ti,tsc2046这款为例简述下tp外设的调试。 整体思路 1、配置设备树----驱动调试的device部分 2、tp驱动编译及匹配—driver部分 3、驱动整体调试 二、配置设备树 对于ti,tsc2046我们可以参考内核Docum…...

ChatGPT指令大全

1. 写报告&#xff1a;我现在正在 [报告的情境与目的]。我的简报主题是 [主题]&#xff0c;请提供 [数字] 种开头方式&#xff0c;要简单到 [目标族群] 能听懂&#xff0c;同时要足够能吸引人&#xff0c;让他们愿意专心听下去。 2. 研究报告&#xff1a;写出一篇有关 [知识] …...

【Vue面试题】Vue2.x生命周期?

文章目录 1.有哪些生命周期&#xff08;系统自带&#xff09;?beforeCreate( 创建前 )created ( 创建后&#xff09;beforeMount (挂载前)mount (挂载后)beforeUpdate (更新前)updated (更新后)beforeDestroy&#xff08;销毁前&#xff09;destroy&#xff08;销毁后&#xf…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...