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

实习这么久,你知道Maven是如何从代码仓库中找到需要的依赖吗?

目录

碎碎念

Maven是如何找到代码仓库里需要的依赖的?

如何根据坐标在本地仓库中寻找所需要的依赖?

如何根据坐标在远程仓库中寻找所需要的依赖?

Maven 如何使用 HTTP 或 HTTPS 协议从远程仓库中获取依赖项,请详细解释其原理


碎碎念

昨晚跟mentor沟通,mentor问了我一个很基础,但是我确实没有往这方面思考🤔,隐约知道有个本地仓库和远程仓库,但是问原理我就不知道了;

所以有了这篇文章,用来学习;接下来请看,四连问!

Maven是如何找到代码仓库里需要的依赖的?

  • 在 Maven 中,要查找并获取项目所需的依赖项,需要配置 Maven 仓库和仓库中的依赖项信息。
  • Maven 仓库是一个包含 Maven 构件和其它依赖项的集合,可以从其中获取所需的依赖项。Maven 仓库分为本地仓库和远程仓库。
  • 本地仓库:
    • 是 Maven 在本地计算机上的一个文件夹,用于存储本地构建和下载的依赖项。在 Maven 的 settings.xml 文件中配置本地仓库的位置。
  • 远程仓库:
    • 是存储在远程服务器上的 Maven 仓库,用于获取项目所需的依赖项。在 Maven 的 settings.xml 文件中配置远程仓库的位置和访问凭据(如果需要验证)。
  • 在 Maven 项目中,需要在 POM 文件中指定所需的依赖项。Maven 根据这些依赖项的坐标(groupId、artifactId、version 和 packaging)在本地仓库和远程仓库中查找依赖项。
  • Maven 首先在本地仓库中查找依赖项,如果没有找到,则从远程仓库中下载依赖项,并将其缓存到本地仓库中以便以后使用。
  • 如果 Maven 无法连接到远程仓库,或者在远程仓库中无法找到所需的依赖项,则 Maven 构建过程将失败。因此,确保正确配置 Maven 仓库非常重要,以确保项目能够成功构建并运行。

如何根据坐标在本地仓库中寻找所需要的依赖?

  • 在本地仓库中查找依赖项,可以按照以下步骤进行:
  • 找到本地仓库的位置:
    • Maven 默认将本地仓库存储在用户主目录下的 .m2 文件夹中。在这个文件夹下,有一个名为 repository 的子文件夹,用于存储所有已经下载的依赖项
    • 例如,如果 Maven 默认的本地仓库路径为 C:\Users\UserName\.m2\repository,则所有已下载的依赖项都存储在 C:\Users\UserName\.m2\repository 目录下。
  • 根据坐标找到依赖项的路径:
    • 在本地仓库中,每个依赖项都被存储在一个以其坐标命名的文件夹中。具体而言,依赖项的路径包括以下几个部分:
    • groupId:依赖项的 Group ID
    • artifactId:依赖项的 Artifact ID
    • version:依赖项的版本号
    • packaging:依赖项的打包方式
    • 例如,对于 JUnit 4.12,其在本地仓库中的路径为:
    • C:\Users\UserName\.m2\repository\junit\junit\4.12\junit-4.12.jar
    • 其中,junit 是 Group ID,junit 是 Artifact ID,4.12 是版本号,.jar 是打包方式。
  • 在本地仓库中查找依赖项:
    • 根据依赖项的坐标,在本地仓库中查找该依赖项。具体而言,可以在本地仓库的路径下,查找与该依赖项坐标对应的文件夹或文件。
    • 如果在本地仓库中找到了该依赖项,那么 Maven 就可以直接使用该依赖项,而无需再次下载。
    • 如果在本地仓库中没有找到该依赖项,那么 Maven 就会尝试从远程仓库中下载该依赖项,并将其保存到本地仓库中,以备将来使用。
  • 综上所述:
    • 根据坐标在本地仓库中寻找所需要的依赖,需要知道本地仓库的位置以及依赖项的路径构造方式,并在本地仓库中查找与该依赖项坐标对应的文件夹或文件。

如何根据坐标在远程仓库中寻找所需要的依赖?

  • 在 Maven 中,根据坐标在远程仓库中寻找所需要的依赖项的过程涉及到一系列协议和约定,其中最常用的协议是 HTTP 或 HTTPS
  • 在 Maven 中,远程仓库可以使用多种协议进行访问,例如 HTTP、HTTPS、FTP 等。默认情况下,Maven 使用 HTTP 或 HTTPS 协议从远程仓库中获取依赖项。通过配置 Maven 的 settings.xml 文件,可以指定所需的远程仓库的位置和其他信息,例如 URL、用户名和密码等。
  • 在使用 Maven 时,当指定了一个依赖项的坐标时,Maven 会根据这个坐标的信息来构造一个特定的 URL,然后使用 HTTP 或 HTTPS 协议请求这个 URL,以在远程仓库中查找所需的依赖项。如果依赖项存在于远程仓库中,Maven 将下载这个依赖项并保存到本地仓库中
  • 需要注意的是,Maven 在查找依赖项时会按照特定的顺序搜索本地仓库和远程仓库。具体而言,它首先搜索本地仓库,然后按照 settings.xml 文件中指定的顺序搜索远程仓库,直到找到所需的依赖项为止。如果 Maven 找不到所需的依赖项,则构建过程将失败。
  • 关于如何配置 Maven 的 settings.xml 文件来指定远程仓库的位置和其他信息,可以参考 Maven 官方文档中的说明。

Maven 如何使用 HTTP 或 HTTPS 协议从远程仓库中获取依赖项,请详细解释其原理

  • Maven 使用 HTTP 或 HTTPS 协议从远程仓库中获取依赖项的过程,涉及到以下几个步骤:
  • 构造依赖项的坐标:
    • 在 Maven 项目的 POM 文件中,需要指定所需的依赖项,包括其 groupId、artifactId、version 和 packaging 等信息。Maven 根据这些信息构造出一个唯一的坐标,用于标识该依赖项。
    • 例如,以下是一个用于指定 JUnit 依赖项的 POM 片段:
      • <dependency>
      •   <groupId>junit</groupId>
      •   <artifactId>junit</artifactId>
      •   <version>4.12</version>
      •   <scope>test</scope>
      • </dependency>
    • 其中,JUnit 的坐标为:junit:junit:4.12
  • 构造依赖项在远程仓库中的 URL:
    • Maven 使用依赖项的坐标,构造出依赖项在远程仓库中的 URL。具体而言,Maven 根据坐标信息,构造出如下格式的 URL:
      • http(s)://<repo-url>/<groupId>/<artifactId>/<version>/<artifactId>-<version>.<packaging>
    • 例如,对于 JUnit 4.12,Maven 构造出的 URL 为:
      • https://repo.maven.apache.org/maven2/junit/junit/4.12/junit-4.12.jar
  • 发送 HTTP(S) 请求获取依赖项:
    • Maven 使用构造出的 URL,向远程仓库发送 HTTP(S) 请求,以获取依赖项的内容。具体而言,Maven 会向远程仓库发送 GET 请求,请求该 URL 对应的资源。
    • 如果远程仓库中存在该依赖项,并且 Maven 有权访问该资源,则远程仓库会返回该依赖项的内容,以响应 Maven 的请求。
  • 将依赖项保存到本地仓库:
    • 一旦 Maven 获取了依赖项的内容,它将把该依赖项保存到本地仓库中。Maven 会将该依赖项的内容保存到本地仓库的对应位置,以备将来使用。
    • 如果 Maven 在本地仓库中已经存在该依赖项,则不会再次从远程仓库中获取该依赖项。相反,Maven 会直接从本地仓库中读取该依赖项的内容,并将其用于项目构建。
  • 综上所述,Maven 使用 HTTP 或 HTTPS 协议从远程仓库中获取依赖项的过程,包括构造依赖项的坐标、构造依赖项在远程仓库中的 URL、发送 HTTP(S) 请求获取依赖项,以及将依赖项保存到本地仓库等多个步骤。

相关文章:

实习这么久,你知道Maven是如何从代码仓库中找到需要的依赖吗?

目录 碎碎念 Maven是如何找到代码仓库里需要的依赖的&#xff1f; 如何根据坐标在本地仓库中寻找所需要的依赖&#xff1f; 如何根据坐标在远程仓库中寻找所需要的依赖&#xff1f; Maven 如何使用 HTTP 或 HTTPS 协议从远程仓库中获取依赖项&#xff0c;请详细解释其原理…...

低代码/零代码的快速开发框架

目前国内主流的低代码开发平台有&#xff1a;宜搭、简道云、明道云、云程、氚云、伙伴云、道一云、JEPaaS、华炎魔方、搭搭云、JeecgBoot 、RuoYi等。这些平台各有优劣势&#xff0c;定位也不同&#xff0c;用户可以根据自己需求选择。 一、阿里云宜搭 宜搭是阿里巴巴集团在20…...

C# 中常见的设计模式

设计模式是一套被广泛应用于软件设计的最佳实践&#xff0c;它们可以帮助开发者解决特定的问题&#xff0c;提高代码的可重用性、可读性和可维护性。本文将介绍 C# 中常见的几种设计模式&#xff0c;并提供相应的示例代码。 工厂模式 工厂模式是一种创建型设计模式&#xff0c…...

promethues/servicemonitor

目录 1.promethues 能保证源源不断地采集/metrics 信息吗&#xff1f;每次都是最新的吗 2.部署servicemonitor 的作用是什么&#xff1f; 3.pod 部署采集数据直接上报promthues &#xff0c;不通过servicemonitor 可以吗&#xff1f; 4.你说的"此外&#xff0c;如果部署…...

postman使用简介

1、介绍 postman是一款功能强大的网页调试和模拟发送HTTP请求的Chrome插件&#xff0c;支持几乎所有类型的HTTP请求 2、下载及安装 官方文档&#xff1a;https://www.getpostman.com/docs/v6/ chrome插件&#xff1a;chrome浏览器应用商店直接搜索添加即可&#xff08;需墙&…...

@DS注解在事务中实现数据源的切换@DS在事务中失效【已解决】

在Springboot的application.yml中的配置&#xff1a; spring:datasource:url: jdbc:mysql://localhost:3306/test2?serverTimezoneUTC&useUnicodetrue&characterEncodingutf8driver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: rootdynamic:primar…...

Java I/O之文件系统

一、全文概览 在学习文件系统之前&#xff0c;需要了解下Java在I/O上的发展史&#xff1a;在Java7之前&#xff0c;打开和读取文件需要编写特别笨拙的代码&#xff0c;涉及到很多的InputStream、OutputStream等组合起来使用&#xff0c;每次在使用时或许都需要查一下文档才能记…...

Mysql元数据获取方法(information_schema绕过方法)

前提&#xff1a;如果waf或其它过滤了information_schema关键字&#xff0c;那我们该如何获取元数据呢&#xff1f;能够代替information_schema的有&#xff1a;sys.schema_auto_increment_columnssys.schema_table_statistics_with_bufferx$schema_table_statistics_with_buff…...

Eclipse快捷键

* 1.补全代码的声明&#xff1a;alt /* 2.快速修复: ctrl 1 * 3.批量导包&#xff1a;ctrl shift o* 4.使用单行注释&#xff1a;ctrl /* 5.使用多行注释&#xff1a; ctrl shift / * 6.取消多行注释&#xff1a;ctrl shift \* 7.复制指定行的代码&#xff1a;ctrl a…...

java ssm自习室选座预约系统开发springmvc

人工管理显然已无法应对时代的变化&#xff0c;而自习室选座预约系统开发能很好地解决这一问题&#xff0c;既能提高人力物力&#xff0c;又能提高预约选座的知名度&#xff0c;取代人工管理是必然趋势。 本自习室选座预约系统开发以SSM作为框架&#xff0c;JSP技术&#xff0c…...

分享我从功能测试转型到测试开发的真实故事

由于这段时间我面试了很多家公司&#xff0c;也经历了之前公司的不愉快。所以我想写一篇文章来分享一下自己的面试体会。希望能对我在之后的工作或者面试中有一些帮助&#xff0c;也希望能帮助到正在找工作的你。 找工作 我们总是草率地进入一个自己不了解的公司工作&#xf…...

TypeScript快速入门———(二)TypeScript常用类型

文章目录概述1 类型注解2 常用基础类型概述3.原始类型4 数组类型5 类型别名6.函数类型7 对象类型8 接口9 元组10 类型推论11 类型断言12 字面量类型13 枚举14 any 类型15 typeof概述 TypeScript 是 JS 的超集&#xff0c;TS 提供了 JS 的所有功能&#xff0c;并且额外的增加了…...

Mac M1 使用Centos8➕VMware Fusion进行静态网络配置

大部分的流程网络上面都有当我们已经下载好mac m1版的Centos8链接: https://pan.baidu.com/s/1UTl4Lo-_c17s-PDj3dA6kA 提取码: 7xh2 和VMware Fusionhttps://www.vmware.com/cn/products/fusion.html之后就可以进行安装了在导入过后 记得将硬盘和内存都设置好了 记得在关机状态…...

RadGraph: Extracting Clinical Entities and Relations from Radiology Reports代码

文章来源&#xff1a;NeurIPS 文章类别&#xff1a;IE(Information Extraction) RadGraph主要基于dygie&#xff0c;主要文件为inference.py。 inference.py&#xff1a; 1、get_file_list(data_path) def get_file_list(path):file_list [item for item in glob.glob(f&q…...

13. OPenGL与QT界面元素交互控制图形渲染

1. 说明&#xff1a; 前面文章中讲到的 OPenGL 渲染都是在页面加载完成即立刻渲染的&#xff0c;如果向控制图形渲染的时间&#xff0c;可以在QT界面中添加一些元素来进行控制。此时需要用到OPenGL当中的makeCurrent(),update(),doneCurrent()函数。 效果展示&#xff1a; ope…...

高通平台开发系列讲解(USB篇)libuvc详解

文章目录 一、什么是UVC二、UVC拓扑结构三、libuvc的预览时序图沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍libuvc。 一、什么是UVC UVC,全称为:USB video(device) class。 UVC是微软与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标…...

ICC2:set_route_opt_target_endpoints

route_opt阶段通过指定endpoint/driver pin list的方式执行incremental优化。 set_route_opt_target_endpoints [-setup_endpoints file] [-setup_endpoints_collection pin_list] [-hold_endpoints file] [-hold_endpoints_collection pin_list] [-ldrc_objects fil…...

5、小程序面试题

1, 小程序页面有哪些生命周期函数onLoad: 页面加载onReady: 页面初次渲染完成onShow: 页面显示onHide: 页面隐藏onUnload: 页面卸载2, 一页小程序页面有哪些文件组成,分别有什么作用.wxml: 使用微信框架设计的一套组件构建页面结构.wxss: 用于设置页面样式, 和css基本一致.js :…...

Java特殊操作流

6 特殊操作流 6.1 标注输入输出流 System类中有两个静态的成员变量&#xff1a; public static final InputStream in&#xff1a;标准输入流&#xff0c;通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源public static final PrintStream out&#xff1a;标准输…...

如何用SCRM销售管理系统管理销售和做销售管理

每一家企业都在找适合自己公司的销售管理方法&#xff0c;实现销售目标和努力提高业绩。 我们常说&#xff0c;做好销售管理有很多路径和方法&#xff0c;但我们不知道从哪里开始&#xff1f;每个阶段我们该怎么办&#xff1f;如何有效管理销售团队&#xff1f;好的企企业微信…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...