【Maven】依赖范围、依赖传递、依赖排除、依赖原则、依赖继承

【Maven】依赖范围、依赖传递、依赖排除、依赖原则、依赖继承

  • 依赖范围
  • 依赖传递
  • 依赖排除
  • 依赖原则
  • 依赖继承

依赖范围

  在Maven中,依赖范围(Dependency Scope)用于控制依赖项在编译、测试和运行时的可见性和可用性。通过指定适当的依赖范围,可以在不同的构建和执行环境中控制依赖项的加载和使用。

  compile(默认):该依赖项在编译、测试和运行时都可用。这是大多数依赖项的默认范围。
  test:该依赖项只在测试编译和测试运行期间可用,不会被导入到最终的构件中。
  provided:该依赖项由 JDK 或容器(如 Tomcat)提供,编译和测试时可用,但在打包构建产物时不会包含它。需要确保在目标环境中该依赖项可以被提供。
  runtime:该依赖项在编译时不可用,但在运行时和测试时可用。例如,JDBC 驱动程序通常以此范围进行声明,因为编译时并不需要 JDBC 驱动程序,但在运行时需要它来连接数据库。

  以下示例演示了如何指定依赖范围:

<dependencies><dependency><groupId>com.example</groupId><artifactId>my-library</artifactId><version>1.0.0</version><scope>runtime</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies>

依赖传递

  在Maven中,依赖传递(Dependency Transitivity)是指当一个项目依赖于其他项目时,它会自动获取这些依赖项所依赖的其他项目。

  依赖传递是Maven的重要特性之一,它使得在项目中声明的依赖项可以自动解析和下载其所依赖的其他库,并将其包含在项目构建中。

  例如,如果项目 A 依赖于项目 B,而项目 B 又依赖于项目 C,那么在Maven构建过程中,项目 A 将自动获取项目 B 和项目 C 的依赖。这样,你不需要手动在项目 A 中声明对项目 C 的依赖,Maven将自动完成这个过程。

  依赖传递还可以处理依赖冲突。当多个依赖项声明了相同的库但版本不同时,Maven会使用一定的规则来解决冲突。通常,它会选择一个合适的版本来满足所有依赖项,并将其包含在最终的构建结果中。也可以通过显式地声明特定版本来覆盖冲突解析过程。

  下面是一个例子:

  spring-boot-starter依赖了下面4个jar包,所以项目也会自动下载引入下面的4个包。

依赖排除

  在Maven中,依赖排除(Dependency Exclusion)是指从传递的依赖关系中排除某个特定的依赖项。这可以用于解决依赖冲突或避免引入不需要的依赖项。

  有时候,一个项目可能依赖于某个库,而该库本身又依赖于其他库。但是,由于项目已经显式声明了对其他库的依赖,可能希望排除传递依赖关系中的某个库,以避免版本冲突或避免引入不需要的库。

  通过使用 <exclusions>元素,可以在Maven的依赖声明中指定要排除的依赖项。下面是例子:

<project><dependencies><dependency><groupId>com.example</groupId><artifactId>project-a</artifactId><version>1.0.0</version><exclusions><exclusion><groupId>com.example</groupId><artifactId>unwanted-library</artifactId></exclusion></exclusions></dependency></dependencies>
</project>

依赖原则

  依赖的原则:它是为了解决工程模块之间的jar包冲突的问题的,我们无法设置,maven有默认的原则,我们需要了解。

  当多个依赖项引入了相同的库但不同的版本时,Maven使用一套规则来解决依赖冲突。通常情况下,较高版本的库会被选择,但也可以使用 <dependencyManagement><exclusions> 等元素来显式地解决依赖冲突问题。

依赖继承

  如果项目需要将各个模块的 junit 版本统一为 4.9,那么到各个工程中手动修改无疑是非常不可取的。

  使用继承机制就可以将这样的依赖信息统一提取到父工程模块中进行统一管理。

  创建父工程和创建一般的 Java 工程操作一致,唯一需要注意的是:打包方式处要设置为 pom。

  而在子工程中只需要引入父工程的工程坐标就可以了。

<parent><!-- 父工程坐标 --><groupId>...</groupId><artifactId>Parent</artifactId><version>0.0.1-SNAPSHOT</version><!-- 指定从当前子工程的pom.xml文件出发,查找父工程的pom.xml的路径 --><relativePath>../Parent/pom.xml</relativePath>
</parent>

  此时如果子工程的 groupId 和 version 和父工程重复则可以删除。
  将 Parent 项目中的 dependencies 标签,用 dependencyManagement 标签括起来。

<dependencyManagement><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency></dependencies>
</dependencyManagement>

  在子项目中重新指定需要的依赖,删除范围和版本号。

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency>
</dependencies>

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

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

相关文章

uniapp-原生地图截屏返回base64-进行画板编辑功能

一、场景 vue写uniapp打包安卓包&#xff0c;实现原生地图截屏&#xff08;andirod同事做的&#xff09;-画板编辑功能 实现效果&#xff1a; 二、逻辑步骤简略 1. 由 原生地图nvue部分&#xff0c;回调返回 地图截屏生成的base64 数据&#xff0c; 2. 通过 uni插件市场 im…

【pinia】Pinia入门和基本使用:

文章目录 一、 什么是pinia二、 创建空Vue项目并安装Pinia1. 创建空Vue项目2. 安装Pinia并注册 三、 实现counter四、 实现getters五、 异步action六、 storeToRefs保持响应式解构七、基本使用&#xff1a;【1】main.js【2】store》index.js【3】member.ts 一、 什么是pinia P…

flink如何监听kafka主题配置变更

背景&#xff1a; 从前一篇文章我们知道flink消费kafka主题时是采用的手动assign指定分区的方式&#xff0c;这种消费方式是不处理主题的rebalance操作的&#xff0c;也就是消费者组中即使有消费者退出或者进入也是不会触发消费者所消费的分区的&#xff0c;那么疑问就来了&am…

PHP实现在线进制转换器,10进制,2、4、8、16、32进制转换

1.接口文档 2.laravel实现代码 /*** 进制转换计算器* return \Illuminate\Http\JsonResponse*/public function binaryConvertCal(){$ten $this->request(ten);$two $this->request(two);$four $this->request(four);$eight $this->request(eight);$sixteen …

Redis的AOF持久化

除了RDB持久化功能之外&#xff0c;Redis还提供了AOF持久化功能。与RDB 持久化通过保存数据库中的键值对来记录数据库状态不同&#xff0c;AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的&#xff0c;如下图所示。 举个例子&#xff0c;如果我们对空白的数据…

什么是DNS欺骗及如何进行DNS欺骗

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、什么是 DNS 欺骗&#xff1f;二、开始1.配置2.Ettercap启动3.操作 总结 前言 我已经离开了一段时间&#xff0c;我现在回来了&#xff0c;我终于在做一个教…

Centos8上加速git clone

首先通过命令获取域名对应的IP地址 [rootggbond ~]# nslookup github.global.ssl.fastly.net [rootggbond ~]# nslookup github.com 之后如上获取到的IP地址 以IP-域名的格式加入到hosts文件中 [rootggbond ~]# vim /etc/hosts Centos8上更新DNS缓存 [rootggbond ~]# nscd -…

Java课题笔记~ HTTP协议(请求和响应)

Servlet最主要的作用就是处理客户端请求&#xff0c;并向客户端做出响应。为此&#xff0c;针对Servlet的每次请求&#xff0c;Web服务器在调用service()方法之前&#xff0c;都会创建两个对象 分别是HttpServletRequest和HttpServletResponse。 其中HttpServletRequest用于封…

腾讯云香港服务器租用价格_CN2线路延迟速度测试

腾讯云香港服务器&#xff0c;目前中国香港地域轻量应用服务器可选配置2核2G20M、2核2G30M、2核4G30M&#xff0c;操作系统可选Windows和Linux&#xff0c;不只是香港云服务器&#xff0c;新加坡、硅谷、法兰克福和东京服务器均有活动&#xff0c;腾讯云服务器网分享腾讯云境外…

Node.js学习笔记-03

七、网络编程 1. 构建 TCP 服务 TCP 是面向连接的协议&#xff0c;显著特征 在传输之前需要3次握手形成会话。 客户端 ——请求连接——> 服务器端 ——响应——> 客户端 ——开始传输——> 服务器端。 2. 构建 UDP 服务 3. 构建 HTTP 服务 http模块 在node中HTT…

dotNet 之数据库sqlite

Sqlite3是个特别好的本地数据库&#xff0c;体积小&#xff0c;无需安装&#xff0c;是写小控制台程序最佳数据库。NET Core是同样也是.NET 未来的方向。 **硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 D…

pythonocc进阶学习:投影projection

1.点 到 线,&#xff08;直线,曲线&#xff09;等上的投影 staticmethod # 点到Lin的投影 def Project_Pnt_To_Lin(p: gp_Pnt, lin: gp_Lin):Edge BRepBuilderAPI_MakeEdge(lin).Edge()curve BRep_Tool.Curve(Edge)proPnt GeomAPI_ProjectPointOnCurve(p, curve[0])Neares…