【Maven】依赖管理,Maven仓库,Maven核心功能

server/2024/10/8 23:46:38/

Maven 是一个项目管理工具,基于 POMProject Object Model,项目对象模型)的概念,Maven 可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件

大白话:Maven 是一个项目管理工具,通过 pom.xml 文件的配置获取 jar 包,而不用手动去添加 jar

  • 项目开发:编译、打包(jar 包)、运行。

image.png|408

什么是 Maven

Maven 是一个项目管理工具,基于 POMProject Object Model,项目对象模型)的概念,Maven 可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件

大白话:Maven 是一个项目管理工具,通过 pom. xml 文件的配置获取 jar 包,而不用手动去添加 jar 包

  • Maven 简单,高效,可以提高我们的开发效率,减少我们的开发 bug。
  • Maven 提供的功能非常多,在这主要体现两方面:
    • 项目构建
    • 管理依赖

创建一个 Maven 项目

IDEA 本身已经继承了 Maven,我们可以直接使用,无需安装

以下截图的 IDEA 版本为:2024.1.2,不同版本的 IDEA 界面展示会有不同

image.png|408

  • 点击 create,就创建好了一个 Maven 项目

image.png|267

Maven 核心功能

接下来我们结合项目,介绍 Maven 在项目开发中的作用

  1. 项目构建
  2. 管理依赖

项目构建

Maven 提供了标准的,跨平台(LinuxWindowsMacOS 等)的自动化项目构建方式

当我们开发了一个项目之后,代码需要经过编译、测试、打包、发布等流程。每次代码的修改,都需要经过这些流程,如果代码反复调试修改,这个流程就需要反复进行,就显得麻烦。而 Maven 给我们提供了一套简单的命令阿里完成项目的构建

image.png|379

  • 比如点击“package”,就可以完成项目的打包操作

image.png

打包就是把所有的 class 文件,全部放在一起,打成 jar 包或者 war

  • jarwar 包是一种压缩文件
  • jar 包就是把开发人员已经写好的一些代码进行打包。打包好的 jar 包就可以进入到其他项目中,也可以直接使用这些 jar 包中的类和属性
  • 另外,也可以打成可执行 jar 包,这样的包就可以通过 java -jar 命令来执行
  • war 包可以理解为是一个 web 项目,里面是项目的所有东西,通常用于网站

依赖管理

上面说到,Maven 是一个项目管理工具,通过 pom.xml 文件的配置获取 jar 包,而不用手动去添加 jar 包获取的 jar 包,其实就是依赖

pom.xml 就是 Maven 的配置文件,用以描述项目的各种信息

依赖配置

依赖:指当前项目运行时所需要的 jar
比如 JDBC,我们需要手动下载 mysql-connector-java 的包,并且添加到项目中


如果使用 Maven,我们只需要在 pomxml 中引入 mysql-connector-java 的依赖就可以了

<dependencies>  <!--里面放置项目的依赖坐标,可以为多个-->  
</dependencies>
  1. pom 文件 <dependencies> 标签内,添加依赖坐标
<dependencies>  <groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version>  
</dependencies>
  1. 点击刷新按钮,引入新加的依赖 jar 包

    • 后续有添加新的 jar 包,或者修改 jar 包的版本,都需要通过该方式在项目中添加依赖image.png|246
  2. 刷新完之后,就可以在项目中看到新加入的 jar 包

依赖传递

早期我们没有使用 Maven 时,向项目中添加依赖的 jar 包,需要把所有的 jar 包都复制到项目工程下。

比如,A 依赖 B,B 依赖 C,那么 A 项目引入 B 的同时,也需要引入 C,如果我们手动管理这个依赖,这个过程就会比较麻烦,我们需要知道每个库都依赖哪些库,以及这些依赖之间的版本是如何关联的

  • 比如我们要吃火锅,需要有锅、调料、食材,以及确定什么样的锅,什么样的食材
  • 比如去医院看病,需要带上以往的病例,检查结果、处方等,并且要确定带的资料是正确的。如果日期错了,或者患者错了,带少了,就需要回去重新拿

但如果是使用 Maven 的话,就可以避免管理所需依赖的关系。我们只需要在 pom 文件中,定义直接依赖就可以了。由于 Maven 的依赖具有传递性,所以会自动把所依赖的其他 jar 包也一起导入

  • 比如吃火锅,现在我们点一个海底捞外卖,直接就把所有食材都送过来了,包括什么锅、什么食材
  • 比如去医院看病,借助“互联网”,实现了信息互享,只需要带上身份证,以往的病历和检查结果就都可以看到了

Maven 会把在引入一个依赖的时候,会一起把实现这个功能所需要的依赖也一起自动引入

这里引入 mysql,进行打包,protobuf 就是连带的依赖,需要一起引入

<dependencies>  <dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>  <version>8.0.29</version>  </dependency>  
</dependencies>

image.png|458

依赖排除

image.png|422
项目 A ,依赖一个项目 B 和一个 jarA

  • jarA 依赖 jarBjarC
  • 项目 B 里面是各种依赖,其中也用到了 jarC

但是两边都需要引入 jar 包 C,此时我们在哪边进行引入?

一般 jar 包都是向下兼容,高版本可以兼容低版本

最短路径法:
看项目 A 到两个 jarC 放入路径,哪个更短就用哪个

  • 左边的是三步
  • 右边的是两步
    所以就在右边引入 jar

而右边的 jarC 版本比左边的低,无法兼容左边的高版本 jarC。此时就需要将右边的 jarC1.0 升级成 2.0,此时就可以进行指定依赖

  • 首先将 1.0jarC 给排除掉
  • 此时项目中就只剩下 2.0jarC 了,我们在根据路径找 jarC 的时候,就只能找到 2.0jarC

虽然在上面的图片中看起来是有结构的,谁依赖谁。但是放在项目中,都是平铺直叙的,都是放在一起用的

依赖排除

enclusions 就是排除一些依赖,不会默认把相关的所有依赖都进行引入

上面引入依赖的时候,主依赖和相关依赖都是从网上下载的。需要排除一些依赖,就将网上的地址给出来

Maven Help

当项⽬⽐较复杂时,我们就会有 Jar 包冲突的问题,这时候就需要去解决依赖冲突。解决冲突之前,需要先找到冲突,我们可以使⽤ Maven Help 插件来观察包和包之间的依赖关系image.png

  • 如果需要排除某个依赖,就右键点击,选择 Exclude

依赖的坐标

这个代码,我们称之为“坐标”,也就是唯一的

Maven 中,根据 groupIdartfactIdversion 的配置,来唯一识别一个 jar 包,缺一不可。当我们在 pom 文件中配置完依赖之后,点击刷新, Maven 就会根据坐标的位置,去仓库里寻找 jar 包,并把它下载下来,添加到项目中,这个 jar 包下载的地方就叫仓库

仓库:用来存储资源,管理各种 jar

java"><dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>  <version>8.0.30</version>  
</dependency>

Maven 仓库

Maven 仓库分为两种:

  1. 本地仓库
    仓库在你本机电脑上,是本地仓库。其他都是远程仓库

  2. 远程仓库

远程仓库

中央仓库

全球唯一,地址为:
https://repo1.maven.org/maven2/springframework/

里面东西太多了,不好找。可以在这里面进行快速查找:
https://mvnrepository.com

  • 私有服务器
  • 其他公共的

Maven 版本选择哪个?

  1. 没漏洞的
  2. 选择次新版本
  3. 选择人多的
    不严格,推荐是基于大家不知道用哪个的情况,对这个 jar 包不熟的情况

jar 包下载路径

  1. 先去本地仓库查找,如果没有,就去中央仓库查
  2. 如果中央仓库没有,就下载失败,报错
  3. 如果中央仓库有,jar 包就从中央仓库下载到本地仓库
  4. 项目从本地仓库中获取

image.png

image.png
本地仓库原来是空的,随着使用,里面的包越来越多(从中央仓库下载过来的)

私有服务器

中央仓库里面的包是全世界的都可以看到,而有一些不想公开的 jar 包就放在私服中(私有服务器)

  • 有账号和密码,公司里面可以用

image.png

  • 有权限的人,一起使用的
  • 如果遇到私服中不存在的 jar 包,第一个人下载之后,后面的人就从私服中可以获取到了,无需再下载了

其他公共服务器

  • 阿里云
  • 华为云

因为中央仓库在国外,所以下载起来会⽐较慢,所以咱们选择借助国内⼀些公开的远程仓库来下载资源

阿里云就相当于是把中央仓库弄了一个镜像,放在了国内,并公开给人用


如果路径中有中文,修改一下 Maven 本地仓库路径


http://www.ppmy.cn/server/128979.html

相关文章

最经典 的自动驾驶数据集

在科技飞速发展的今天&#xff0c;自动驾驶技术无疑是改变我们未来出行方式的一大亮点。想象一下&#xff0c;未来的某一天&#xff0c;你坐在车里&#xff0c;车子自己就能安全地带你到达目的地&#xff0c;这听起来是不是很酷&#xff1f;不过&#xff0c;虽然自动驾驶技术正…

基于 Seq2Seq 的中英文翻译项目(pytorch)

项目简介 本项目旨在使用 PyTorch 构建一个基于 Seq2Seq&#xff08;编码器-解码器架构&#xff09;的中英文翻译模型。我们将使用双语句子对的数据进行训练&#xff0c;最终实现一个能够将英文句子翻译为中文的模型。项目的主要步骤包括&#xff1a; 数据预处理&#xff1a;…

Java如何调用构造函数和方法以及使用

调用构造函数的格式 构造函数在创建新对象时被调用。调用格式如下&#xff1a; ClassName objectName new ClassName(parameters); ClassName&#xff1a;你需要创建其实例的类的名称。 objectName&#xff1a;你将创建的对象的名称。 parameters&#xff1a;如果你使用的是…

Vue diff 算法介绍

首先我们来了解一下&#xff1a;diff 是什么&#xff1f; 通俗的讲&#xff0c;diff 就是比较两棵树&#xff0c;render 会生成两颗树&#xff0c;一棵新树 newVnode&#xff0c;一棵旧树 oldVnode&#xff0c;然后两棵树进行对比更新找差异就是 diff&#xff0c;全称 differe…

电脑无法无线投屏的解决办法

在前司的时候经常遇到电脑无法使用无线投屏器的情况&#xff0c;今天就来聊聊如何解决。 1.不会连接。这种情况&#xff0c;经常发生在WIN10升级WIN11之后&#xff0c;一般是两种办法&#xff0c;一种是同时按键盘上的WINDOWS和K键&#xff0c;右下角就会出来连接的图标&#…

大数据新视界 --大数据大厂之 Alluxio:解析数据缓存系统的分层架构

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

软件测试——Python和UnitTest框架

文章目录 一、软件测试1.测试计划和测试方案1.测试计划(管理类型文档)2.测试方案(技术型文档) 2.非功能测试设计3.测试报告1.核心内容 4.处理测试过程中出现不可复现的bug 二、Python1.常用语法1.切片2.字符串查找方法&#xff1a;find()3.字符串替换方法&#xff1a;replace()…

Egress Gateway 是一个重要的组件,用于管理从服务网格内部到外部服务的流量

在 Istio 服务网格中&#xff0c;Egress Gateway 是一个重要的组件&#xff0c;用于管理从服务网格内部到外部服务的流量。Egress Gateway 充当了一个边界路由器的角色&#xff0c;处理所有从网格内部发出的请求到非网格服务的流量。它可以帮助解决服务网格内外部服务通信的问题…