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

news2024/11/18 16:28:06

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:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/437854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电脑端(PC)按键精灵——5.找色/找图命令

电脑端(PC)按键精灵——5.找色/找图命令 注&#xff1a;说了键盘、鼠标、其他、控制命令还有安装内容&#xff0c;现在说下颜色/图形命令&#xff0c;这一节相当重要 按键精灵小白入门详细教程&#xff1a; 电脑端(PC)按键精灵—小白入门 详细教程 命令介绍 1.GetPixelCol…

人大金仓携手深信服打造更高效、更融合一体化平台联合解决方案

近日&#xff0c;人大金仓数据库与深信服超融合平台完成深度优化&#xff0c;表现出性能更优、运行更稳定、数据更安全。双方联合打造更高效、更融合的一体化平台联合解决方案&#xff0c;能更好地满足行业信创升级需求。 随着新一轮信创政策陆续出台&#xff0c;信创产业从党政…

基于 SpringBoot + Vue 实现的可视化拖拽编辑的大屏项目

今天给小伙伴们分享一个基于 SpringBoot Vue 实现的可视化拖拽编辑的大屏项目&#xff1b; 一、简介 这个是一个开源的一个BI平台&#xff0c;酷炫大屏展示&#xff0c;能随时随地掌控业务动态&#xff0c;让每个决策都有数据支撑。 多数据源支持&#xff0c;内置mysql、el…

攻防世界-Reversing-x64Elf-100

Reversing-x64Elf-100 18最佳Writeup由 yuchouxuan 提供 收藏 反馈 难度&#xff1a;1 方向&#xff1a;Reverse 题解数&#xff1a;15 解出人数&#xff1a;2460 题目来源: 题目描述: 暂无 note:undefined8 FUN_004006fd(long param_1){int local_2c;char *local_28 …

设置环境变量

文章目录 window设置linux设置python设置 window设置 命令行设置 set 临时设置setx 永久设置 # 打开一个cmd命令行 set # 查看所有环境变量 set FLASK_APPsuperset # 临时设置&#xff0c;当前窗口有效 set FLASK_APP%FLASK_APP%;777 # # 查看 echo %FLASK_APP%# 永久设置…

1.18 从0开始学习Unity游戏开发--资源加载

在上一篇文章中&#xff0c;我们大约是开始接触到资源加载的事情了&#xff0c;场景资源则是一个比较特殊的资源&#xff0c;我们只要添加到Build Settings里面&#xff0c;那么我们就可以通过API直接加载。 但是其他类型的资源怎么办呢&#xff1f;比如我们制作一个网络游戏&…

为什么Spring和IDEA不推荐使用@Autowired注解?

在Spring开发中&#xff0c;Autowired注解是一个常用的依赖注入方式。但是&#xff0c;你可能会惊奇地发现&#xff0c;Spring和IDEA都不推荐使用Autowired注解。关于这个问题&#xff0c;其实答案相对统一&#xff0c;实际上用大白话说起来也容易理解。 官方答案 首先&#…

使用springboot解释什么是jwt

目录 使用springboot解释什么是jwt简介组成结构在springboot中的作用1. 添加依赖 在pom.xml文件中添加以下依赖2. 配置JWT 在Spring Boot的配置文件中配置JWT的相关参数&#xff0c;例如密钥、过期时间等&#xff1a;3. 创建JWT工具类 创建一个JWT工具类&#xff0c;用于生成和…

数据治理体系建设

01 数据治理建设路径 1. 业务数字化的目的是打造一体化的业务流、信息流与数据流 从企业整体经营管理的角度&#xff0c;战略制定及分解—领域业务目标制定—业务方案设计—业务需求识别 & 信息系统功能及数据库设计—数据汇聚及分析—业务目标监测及改善&#xff0c;这个…

Mysql安装详细教程

数据库相关概念 而目前主流的关系型数据库管理系统的市场占有率排名如下&#xff1a; Oracle&#xff1a;大型的收费数据库&#xff0c;Oracle公司产品&#xff0c;价格昂贵。 MySQL&#xff1a;开源免费的中小型数据库&#xff0c;后来Sun公司收购了MySQL&#xff0c;而Oracle…

PEIS体检管理系统源码,自主知识产权,文档齐全,功能完善

PEIS体检管理系统源码&#xff0c;自主知识产权&#xff0c;文档齐全&#xff0c;有演示。 体检条码化管理&#xff0c;体检数据比对&#xff0c;丰富的诊断模板&#xff0c;自动产生小结、综述和建议。 文末获取联系&#xff01; PEIS体检管理系统对医院体检中心进行系统化和…

java二维数组遍历

在 java中&#xff0c;二维数组是指在二维平面上的一个数组。在二维数组中&#xff0c;数据都是按行排序的。我们通常可以用“从上到下”、“从左到右”、“从后到前”等方法来遍历二维数组。由于二维数组中数据的有序性&#xff0c;我们可以在二维数组中快速地找到我们所需要的…

手机穿戴设备能力共享,提升丰富交互体验

HUAWEI Wear Engine面向手机和穿戴设备的应用与服务开发者&#xff0c;提供华为穿戴设备开放能力。 开发者通过调用Wear Engine开放能力&#xff0c;可以实现手机上的生态应用与服务给华为穿戴设备发消息、发通知、传输数据&#xff0c;并获取穿戴设备状态、读取传感器数据等&…

65W氮化镓(GaN)充电头PD快充方案

2023年数码圈中讨论较多的莫过于65W氮化镓&#xff08;GaN&#xff09;充电头。65W快充是目前快充市场出货的主流规格&#xff1b;氮化镓具有高可靠性&#xff0c;能够承受短时间过压&#xff1b;将GaN用于充电器的整流管后&#xff0c;能降低开关损耗和驱动损耗&#xff0c;提…

超清大屏沉浸音效,用极米H6 4K版看剧更有代入感

近日&#xff0c;由张译主演的悬疑剧《他是谁》开播&#xff0c;该剧主要讲述了以卫国平(张译饰)为首的刑警坚持不懈8年追凶&#xff0c;帮受害者讨回公道的故事。《狂飙》作为现象级爆款剧落幕不久&#xff0c;饰演刑警安欣的影帝张译&#xff0c;又在悬疑剧《他是谁》中主演刑…

本地套接字(domain)

本地套接字是一种特殊类型的套接字&#xff0c;和 TCP/UDP 套接字不同。TCP/UDP 即使在本地地址通信&#xff0c;也要走系统网络协议栈&#xff0c;而本地套接字&#xff0c;严格意义上说提供了一种单主机跨进程间调用的手段&#xff0c;减少了协议栈实现的复杂度&#xff0c;效…

consul集群搭建教程

简言 1. 使用consul单节点有宕机&#xff0c;数据丢失的风险&#xff0c;为了安全&#xff0c;使用consul集群更靠谱 2. consul的各个版本下载地址在 Consul Versions | HashiCorp Releases 3. 本文使用consul的版本是consul1.15.1&#xff0c;所以请下载名字为 consul_1.15…

数据密集型应用存储与检索设计

本文内容翻译自《数据密集型应用系统设计》&#xff0c;豆瓣评分高达 9.7 分。 什么是「数据密集型应用系统」&#xff1f; 当数据&#xff08;数据量、数据复杂度、数据变化速度&#xff09;是一个应用的主要挑战&#xff0c;那么可以把这个应用称为数据密集型的。与之相对的是…

免费文本转语音(在线文本转语音)

个人开发的网站&#xff0c;已经维护快一年了&#xff0c;接口稳定&#xff0c;基于微软官方接口&#xff0c;可在线生成&#xff0c;手机电脑平板通用。每天提供一定额度&#xff08;时而5000时而2000时而500&#xff0c;根据服务器压力调整&#xff09;的免费字数供大家使用。…

数画-AI绘画-免费的人工智能AI绘画网站

文章目录 AIGC什么是AI作画&#xff1f;Prompt数画AIGC的未来发展结语 AIGC AIGC&#xff08;AI Generated Content&#xff09;是指利用人工智能生成内容。是利用人工智能来生成你所需要的内容&#xff0c;GC的意思是创作内容。与之相对应的概念中&#xff0c;比较熟知的还有P…