Maven高级(二)--继承与版本锁定

一.继承


1.目的:不同模块中经常需要用到同一个依赖,这样要在每个pom.xml中都引入对应的坐标,继承可以用来解决依赖引入重复的问题。
2.实现:我们可以在创建一个父工程,然后将多个模块来继承这个父工程。然后再将各个模块中都共有的依赖都提取到父工程中进行配置,只要子工程继承了父工程,依赖它也会继承下来,这样就无需在各个子工程中进行配置了。(其实就像aop,和注解提取一样,就是一种提取的思想,将子类共有的依赖提取到父类)
3.案例与具体操作:
【1】案例:有三个模块tlias-pojo,tlias-utils,tlias-web-mangement,他们都有一个相同的依赖--lombok,我们要将这个依赖提取到tlias-parent.

但是因为这是一个springboot项目,而所有的springboot项目都有一个统一的父工程,就是spring-boot-starter-parent。与java一样,Maven不支持多继承。那么怎么解决呢。
不支持多继承,但我们可以多重继承啊。


【2】具体操作
1.创建maven模块tlias-parent,该工程为父工程,在其pom.xml的packaging标签中设置打包方式为pom.
[注:Maven打包方式:
 jar:普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行)
 war:普通web程序打包,需要部署在外部的tomcat服务器中运行
 pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理]
2.在子工程的pom.xml文件中,配置继承关系。例:
以 tlias-utils 为例,指定其父工程。其他的模块,都是相同的配置方式。

<parent><groupId>com.itheima</groupId><artifactId>tlias-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../tlias-parent/pom.xml</relativePath>
</parent><artifactId>tlias-utils</artifactId>
<version>1.0-SNAPSHOT</version>

 注意:(1)在子工程中,配置了继承关系后,groupId是可以省略的,因为会自动继承父工程。
(2)relativePath指定父工程的pom文件的相对位置,如果不指定,将从本地仓库/远程仓库查找该工程。
../代表的上一级目录。
【3】在父工程中配置各个工程共有依赖(子工程会自动继承一拉),然后我们就可以将子工程中的依赖配置和依赖文件删除了。
注:
*我们当前的目录结构:

*实际项目是先设计好模块之后在开始创建模块,开发项目,所以实际中的项目结构更加清晰:

二.版本锁定


1.场景
在开发中,还有一部分依赖,并不是各个模块都共有的,可能只有其中的一小部分模块中使用到了这个依赖。所以说还是有一部分依赖没有被提取,就是分散的。
如果依赖每次更换版本,我们都得找到这个项目中涉及到这个依赖的每一个模块,一个一个的更改,很容易出问题和遗漏。
这时我们就使用Maven的版本锁定功能来统一管理各个依赖的版本。
2.实现
可以在父工程的pom文件中通过<dependencyManagement>来统一管理依赖版本。
父工程:

<!--统一管理依赖版本-->
<dependencyManagement><dependencies><!--JWT令牌--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency></dependencies>
</dependencyManagement>

子工程:

<dependencies><!--JWT令牌--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency>
</dependencies>


面试题:<dependencyManagement> 与 <dependencies> 的区别是什么?
<dependencies> 是直接依赖,在父工程配置了依赖,子工程会直接继承下来。 
<dependencyManagement> 是统一管理依赖版本,不会直接依赖,还是需要在子工程中引入所需依赖,
只是此时就无需指定<version>版本号了。


3.我们之所以之前在springboot项目中很多时候引入依赖坐标不需要写<version>,是因为在springboot自己继承的父工程spring-boot-starter-parent中已经通过<dependencyManagement>对依赖的版本进行统一管理。

4.我们也可以通过自定义属性及属性引用的形式,在父工程中将依赖的版本号进行进一步统一管理。
例1:
 

//自定义属性
<properties><lombok.version>1.18.24</lombok.version>
</properties>
//引用属性
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version>
</dependency>

例2:
 

<properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><lombok.version>1.18.24</lombok.version><jjwt.version>0.9.1</jjwt.version><aliyun.oss.version>3.15.1</aliyun.oss.version><jaxb.version>2.3.1</jaxb.version><activation.version>1.1.1</activation.version><jaxb.runtime.version>2.3.3</jaxb.runtime.version>
</properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency>
</dependencies><!--统一管理依赖版本-->
<dependencyManagement><dependencies><!--JWT令牌--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>${jjwt.version}</version></dependency><!--阿里云OSS--><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>${aliyun.oss.version}</version></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>${jaxb.version}</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>${activation.version}</version></dependency><!-- no more than 2.3.3--><dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>${jaxb.runtime.version}</version></dependency></dependencies>
</dependencyManagement>

这样就可以将版本号进一步移动到父工程的properties中。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0代码训练GPT-5?MIT微软证实GPT-4涌现自我纠错能力迭代

我们都知道&#xff0c;大模型具有自省能力&#xff0c;可以对写出的代码进行自我纠错。 这种自我修复背后的机制&#xff0c;究竟是怎样运作的&#xff1f; 对代码为什么是错误的&#xff0c;模型在多大程度上能提供准确反馈&#xff1f; 近日&#xff0c;MIT和微软的学者发…

了解Spring

目录 什么是Spring? DI Spring 存与取 spring 的存操作 spring的取操作 更快速的进行 Spring 存 与 读 三大注入方式 Autowired set 注入 构造方法注入 Spring 容器中有多个相同的类时 Bean 作用域 设置作用域 Spring 执行流程 Bean 生命周期 什么是Spring? Sp…

uniapp 发送全文件 支持App端ios、android,微信小程序,H5

由于uniapp提供的API在app端只能上传图片和视频&#xff0c;不能上传其他文件&#xff0c;说以只能借助插件了。 ios端用的这个插件 获取到文件对象 免费的 这个是返回一个 filePath 可用直接用于 uni.uploadFile 上传的路径&#xff0c;后面自己又改的File对象 全文件上传选择…

【leetcode】15.三数之和(python+转为两数之和+去重)

class Solution(object):def threeSum(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""# 思路&#xff1a;转为两数之和# for循环遍历先固定一个数字a&#xff0c;寻找另外两个数字之和-a&#xff08;双指针&#xff09;# 难点…

C#基础学习_字段与属性的比较

C#基础学习_字段与属性的比较 字段: 字段主要是为类的内部做数据交互使用,字段一般是private修饰; 字段可以赋值也可以读取; 当需要为外部提供数据的时候,请将字段封装为属性,而不是使用公有字段,这是面对对象编程所提倡的。 //字段:学号private int studentID;属性: …

Redis 持久化

持久化结构图示 官网地址&#xff1a;https://redis.io/docs/management/persistence/ RDB (Redis DataBase) RDB&#xff08;Redis 数据库&#xff09;&#xff1a;RDB 持久性以指定的时间间隔执行数据集的时间点快照。 是什么 在指定的时间间隔&#xff0c;执行数据集的时间…

IllegalArgumentException: OnNoRibbonDefaultCondition异常与Maven Helper插件解决jar包冲突

在搭建Spring Cloud项目时&#xff0c;引入了不同版本的jar&#xff0c;导致项目启动时报错: main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.Bea…

html中表格

一、table标签 参数说明 实例 <body><table border"1" align"center" width"300" height"200" cellspacing"10"><tr><td>1.1</td><td>1.2</td><td>1.3</td></t…

【一】PCIe基础知识

一、PCIe概述 1、PCIe速度 PCI采用总线共享式通讯方式&#xff1b;PCIe采用点到点(Endpoint to Endpoint)通讯方式&#xff0c;互为接收端和发送端&#xff0c;全双工&#xff0c;基于数据包传输&#xff1b;两个PCIe设备之间的连接称作一条链路(link)&#xff0c; 一条链路可…

Arcgis之Python的Arcpy的点线面对象的创建处理和通过pandas读取txt中的经纬度坐标创建几何对象

前言 本节将介绍点线面对象的创建和处理。创建点对象有三个类&#xff0c;分别是Point、Multipoint、PointGeometry&#xff0c;创建线对象的类为Polyline&#xff0c;创建面对象的类为Polygon。 一、点对象的创建——Point 点对象经常与光标配合使用。点要素将返回单个点对…

VOC数据集介绍以及读取(目标检测object detection)

VOC&#xff08;Visual Object Classes&#xff09;数据集是一个广泛使用的计算机视觉数据集&#xff0c;主要用于目标检测、图像分割和图像分类等任务。VOC数据集最初由英国牛津大学的计算机视觉小组创建&#xff0c;并在PASCAL VOC挑战赛中使用。 VOC数据集包含各种不同类别…

Java安全——安全提供者

Java安全 安全提供者 在Java中&#xff0c;安全提供者&#xff08;Security Provider&#xff09;是一种实现了特定安全服务的软件模块。它提供了一系列的加密、解密、签名、验证和随机数生成等安全功能。安全提供者基础设施在Java中的作用是为开发人员提供一种扩展和替换标准…