(三)maven依赖管理机制

目录

1,用可以引用任何你需要的依赖

2,在哪里找到你需要的依赖

3,依赖声明的三要素,坐标

4,依赖范围

4,传递性依赖

5,依赖调解

6,可选依赖


1,用<dependency>可以引用任何你需要的依赖

<dependency>
    <groupId></groupId>
    <artifactId></artifactId>
    <version></version>
    <type></type>
    <scope></scope>
    <optional></optional>
</dependency>

2,在哪里找到你需要的依赖

  • 首先,如果你是要用某个比较重要的技术,比如elasticsearch,spring,mybatis,开源项目,直接到官网里面去,去找里面会告诉你如何在java里面引入maven依赖
  • 其次,可能在你开发的过程中,也许你还需要一些小公司,比如log4j,slf4j,jackson等等这种东西,连官网都不用去了,直接上百度

百度:maven + 你需要的依赖名称,比如log4j

  • 再次,走国外的网站去搜索,速度较慢

sonatype nexus:http://repository.sonatype.org

mvnbrowser:http://www.mvnbrowser.com

3,依赖声明的三要素,坐标

groupId、artifactId、version,就ok了,type很少用

声明了三要素,一个坐标唯一定位了一个依赖的某个版本的jar包,maven会自动到远程的中央仓库里面去,给我们去找,下载到本地来,

在打包的时候,就会自动使用,编译的时候

4,依赖范围 <scope></scope>

maven有三套classpath,classpath,就是项目中用到的各种依赖的类,jvm在运行的时候需要去classpath下面加载对应的类

编译源代码的时候有一套classpath;

在编译测试代码以及执行测试代码的时候,有一套classpath;

运行项目的时候,有一套classpath;

依赖范围就是用来控制依赖包与这三种classpath的关系的。

简单来说,不同的依赖范围,会导致那个依赖包可能在编译、测试或者打包运行的时候,有时候可以使用,有时候不能够使用

  • compile:默认,对编译、测试和运行的classpath都有效。一般都是用这种scope
  • test(测试环境有效):仅仅对于运行测试代码的classpath有效,编译或者运行主代码的时候无效,仅仅测试代码需要用的依赖一般都会设置为这个范围,比如junit。一些测试框架,或者只有在测试代码中才会使用的一些依赖,会设置为test,这个的好处在于说,打包的时候这种test scope的依是不会放到最终的发布包里去的。减少发布包的体积。
  • provided(正式运行环境无效):编译和测试的时候有效,但是在运行的时候无效,因为可能环境已经提供了,比如servlet-api,一般就是这个范围,在运行的时候,servlet容器会提供依赖。servlet-api是用来开发java web项目的,可能你在开发代码和执行单元测试的时候,需要在pom.xml里面声明这个servlet-api的依赖,因为要写代码和测试代码。但是最终打完包之后,放到tomcat容器里面去跑的时候,是不需要将这个servlet-api的依赖包打入发布包中的,因为tomcat容器本身就会给你提供servlet-api的包。
  • runtime(正式运行环境有效):测试和运行classpath有效,但是编译代码时无效,比如jdbc的驱动实现类,比如mysql驱动。因为写代码的时候是基于javax.sql包下的标准接口去写代码的。然后在测试的时候需要用这个包,在实际运行的时候才需要用这个包的,但是编译的时候只要javax.sql接口就可以了,不需要mysql驱动类。一般我们声明mysql驱动的时候,不会设置为runtime,因为也许你开发代码的时候会用到mysql驱动特定的api接口,不仅仅只是用javax.sql。

4,传递性依赖

每个依赖可能又有其他的依赖,其他依赖又有其他的依赖,循环往复

maven的传递性依赖,就是说会自动递归解析所有的依赖,然后负责将依赖下载下来,接着所有层级的依赖,都会成为我们的项目的依赖,不需要我们手工干预。所有需要的依赖全部下载下来,不管有多少层级。这个就是maven的传递性依赖机制,自动给我递归依赖链条下载所有依赖的这么一个特性。

好比说我们依赖了junit,junit依赖了A,A又依赖了B

我们对junit的依赖范围是test,junit对A的依赖范围是compile,那么我们对A的依赖范围是什么呢? -> test

比如说,我们依赖于A,是compile;A依赖于B,是test;我们对B的依赖范围是空,就是我们不会去依赖B,因为你自己想想都知道,A只有在测试的时候才会使用B。我们依赖A是生产用的,我们去依赖B干嘛?B是给A测试的。

传递性依赖机制对依赖范围也是有影响的,比如下面的表格,第一列是一级依赖,第一行是二级依赖,传递性依赖会导致多级依赖的依赖范围交叉在一起,会有影响:

compile

test

provided

runtime

compile

compile

runtime

test

test

test

provided

provided

provided

provided

runtime

runtime

runtime

有可能依赖是不会传递的,就是可能有些多层级的依赖,是不会成为我们项目的依赖的

5,依赖调解

传递性依赖深入去讲解的,既然说maven会自动解析所有层级的依赖,给我们自动下载所有的依赖,但是可能会出现依赖冲突的问题

比如A->B->C->X(1.0),A->D->X(2.0),A有两个传递性依赖X,不同的版本

就产生了依赖冲突的问题,maven如何解决呢?依赖调解的机制

  • 此时就会依赖调解,就近原则,离A最近的选用,就是X的2.0版本
  • 如果A->B->X(1.0)和A->D->X(2.0),路径等长呢?那么会选择第一声明原则,哪个依赖在pom.xml里先声明,就用哪个

6,可选依赖

<optional>true</optional> , 此时依赖传递失效,不会向上传递

如果A依赖于B,B依赖于C,B对C的依赖是optional,那么A就不会依赖于C。反之,如果没有optional,根据传递性依赖机制,A会依赖于C。

比如项目B是一个通用的数据访问平台,可以接elasticsearch,可以接hbase,可以接redis,有几个依赖,但是这些依赖可能是不可以同时使用的,此时就可以声明为optional不要向上传递

那么如果项目A依赖项目B,此时就需要根据自己的需求,引入elasticsearch/hbase/redis的依赖,让B可以跑起来。比如说,A就依赖于使用B来访问elasticsearch,那么A自己就引入elasticsearch的依赖即可。B对elasticsearch,hbase,redis的依赖是不会自动传递给A的,需要A自己去声明。

这个很少很少用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java NIO Buffer

Buffer是一块内存&#xff0c;主要用在NIO Channel&#xff0c;比如FileChannel,SocketChannel。 对Channel的读写都是直接操作Buffer对象。 Buffer是一个工具类&#xff0c;提供了操作这个内存块的方法。 Buffer的实现主要有以下几种&#xff1a; Buffer的类型&#xff1a; …

我一个普通程序员,光靠GitHub打赏就年入70万,

一个国外程序员名叫 Caleb Porzio在网上公开了自己用GitHub打赏年入70万的消息和具体做法。 Caleb Porzio 发推庆祝自己靠 GitHub 打赏&#xff08;GitHub Sponsors&#xff09;赚到了 10 万美元。 GitHub Sponsors是 GitHub 2019 年 5 月份推出的一个功能&#xff0c;允许开发…

ConvMixer:Patches Are All You Need

Patches Are All You Need 发表时间&#xff1a;[Submitted on 24 Jan 2022]&#xff1b; 发表期刊/会议&#xff1a;Computer Vision and Pattern Recognition&#xff1b; 论文地址&#xff1a;https://arxiv.org/abs/2201.09792&#xff1b; 代码地址&#xff1a;https:…

Redis 主从库如何实现数据一致?

目录 1、主从库间如何进行第一次同步&#xff1f; 2、主从级联模式分担全量复制时的主库压力 3、主从库间网络断了怎么办&#xff1f; 总结 // 好的文章&#xff0c;值得反复去读 Redis 具有高可靠性&#xff0c;这里有两层含义&#xff1a;一是数据尽量少丢失&#xff0c;…

【Copula】基于二元Frank-Copula函数的风光出力场景生成方法【考虑风光出力的不确定性和相关性】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SpringBoot:SpringBoot 的底层运行原理解析

声明原文出处&#xff1a;狂神说 文章目录1. pom.xml1 . 父依赖2 . 启动器 spring-boot-starter2. 主启动类的注解1. 默认的主启动类2. SpringBootApplication3. ComponentScan4. SpringBootConfiguration5. SpringBootApplication 注解6. spring.factories7. 结论8. 简单图解3…

【Python】如何使用Pandas进行数据可视化?

如何使用Pandas进行数据可视化&#xff1f;1. 如何创建简单图&#xff1f;1.1 创建线型图1.2 绘制直方图1.3 绘制条形图1.4 绘制饼图1.5 绘制散点图2. Plot方法有哪些&#xff1f;3. 如何定制图表的样式和颜色&#xff1f;4. 如何同时对多个DataFrame绘图&#xff1f;5. 总结参…

K8s运维-高级网络策略介绍

1什么是NetworkPolicy&#xff1f;如果你希望在 IP 地址或端口层面&#xff08;OSI 第 3 层或第 4 层&#xff09;控制网络流量&#xff0c; 则你可以考虑为集群中特定应用使用 Kubernetes 网络策略&#xff08;NetworkPolicy&#xff09;。NetworkPolicy 是一种以应用为中心的…

【1615. 最大网络秩】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络。每个 roads[i] [ai, bi] 都表示在城市 ai 和 bi 之间有一条双向道路。 两座不同城市构成的 城市对 的 网络秩 定义为&#xff…

从0到1构建springboot web应用镜像并使用容器部署

文章目录一、生成镜像的两种方法1.1、使用commit生成镜像1.1.1、拉取Centos基础镜像1.1.2、启动Centos容器并安装Go1.1.3、commit生成新镜像1.1.4、使用新镜像验证Golang环境1.2、使用Dockerfile生成镜像二、基于Dockerfile生成一个springboot镜像2.1、准备springboot应用jar包…

python自动化办公(一)

本文代码参考其他教程书籍实现。 文章目录文件读写open函数读取文本文件写入文本文件文件和目录操作使用os库使用shutil库文件读写 open函数 open函数有8个参数&#xff0c;常用前4个&#xff0c;除了file参数外&#xff0c;其他参数都有默认值。file指定了要打开的文件名称&a…

FreeRTOS系列第1篇---为什么选择FreeRTOS?

1.为什么学习RTOS&#xff1f; 作为基于ARM7、Cortex-M3硬件开发的嵌入式工程师&#xff0c;我一直反对使用RTOS。不仅因为不恰当的使用RTOS会给项目带来额外的稳定性风险&#xff0c;更重要的是我认为绝大多数基于ARM7、Cortex-M3硬件的项目&#xff0c;还没复杂到使用RTOS的地…

【华为机试真题详解 Python实现】最差产品奖【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述示例 1题目解析参考代码前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能…

SpringBoot和Spring AOP默认动态代理方式

SpringBoot和Spring AOP默认动态代理方式 目录SpringBoot和Spring AOP默认动态代理方式1. springboot 2.x 及以上版本2. Springboot 1.x3.SpringBoot 2.x 为何默认使用 CglibSpring 5.x中AOP默认依旧使用JDK动态代理SpringBoot 2.x开始&#xff0c;AOP为了解决使用JDK动态代理可…

做技术,最忌讳东张西望

又好长时间没更新&#xff0c;研二了&#xff0c;忙着做实验、写论文、发论文&#xff0c;再加上给我导做一些事情&#xff08;都习惯了&#xff0c;以前很不爽的事情&#xff0c;现在居然能这么平静的说出来&#xff09;。 但这不是我今天说的重点&#xff0c;而是另外一件事…

【开发工具】idea配置全局变量Jdk、maven仓库、maven(全文图解)

文章目录IDEA配置JDK1、点击File -->Project Structure&#xff1b;2、点击左侧标签页SDKs选项&#xff0c;再点击左上角“”&#xff0c;选择JDK&#xff1b;3、在弹出框选择JDK安装路径&#xff0c;点击OK即可配置成功。配置maven仓库&#xff08;阿里云&#xff09;1、配…

素材要VIP咋整?看python大展神通

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 再我们缺少素材的时候&#xff0c;我们第一反应 我们肯定会去网上寻找&#xff0c;但是&#xff01;&#xff01; 有的素材需要VIP&#xff01;这可咋整呢&#xff1f; 看我利用python大展神通&#xff0c;采集某图网图片…

面试官:关于CPU你了解多少?

CPU是如何执行程序的&#xff1f; 程序执行的基本过程 第一步&#xff0c;CPU 读取「程序计数器」的值&#xff0c;这个值是指令的内存地址&#xff0c;然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址&#xff0c;接着通知内存设备准备数据&#xff0c;数据准…

Altium Designer(AD)软件使用记录11-PCB布线部分之走线

目录Altium Designer(AD)软件使用记录11-PCB布线部分之走线核心-SDRAM-FLASH 模块走线BGA 滤波电容放置处理其他杂线走线清理Altium Designer(AD)软件使用记录11-PCB布线部分之走线 核心-SDRAM-FLASH 模块走线 走线总结&#xff1a; 走线从核心器件部分&#xff0c;线路密度最…

Java——二叉树的最近公共祖先及二叉搜索树介绍

目录 二叉树的最近公共祖先 题目 思路一&#xff1a;如果给定的是一颗二叉搜索树&#xff0c; 思路二&#xff1a;假设是孩子双亲表示法 二叉搜索树 定义Node类 查找 删除 插入 二叉树的最近公共祖先 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百…
最新文章