Maven进阶——坐标、依赖、仓库
目录
1.pomxml文件
2. 坐标
2.1 坐标的概念
2.2 坐标的意义
2.3 坐标的含义
2.4 自己项目的坐标
2.5 第三方项目坐标
3. 依赖
3.1 依赖的意义
3.2 依赖的使用
3.3 第三方依赖的查找方法
3.4 依赖范围
3.5 依赖传递和可选依赖
3.5.1 依赖传递
3.5.2 依赖范围对传递依赖的影响
3.5.3 依赖阻断
3.5.4 可选依赖
4. 仓库
4.1 仓库的概念
4.2 本地仓库
4.3 中央仓库
4.4 依赖搜索顺序
1.pomxml文件
就像 Make 的 MakeFile、Ant 的 build.xml 一样,Maven 项目的核心是 pom.xml。POM( Project Object Model,项目对象模型 ) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
2. 坐标
2.1 坐标的概念
在 Maven 中坐标是构件的唯一标识,Maven 坐标的元素包括 groupId、artifactId、version、packaging、classifier。上述5个元素中,groupId、artifactId、version 是必须定义的,packaging 是可选的 ( 默认为 jar )。
2.2 坐标的意义
- Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范
- 拥有了统一规范,就可以把查找工作交给机器
2.3 坐标的含义
groupId:组织标识,一般为:公司网址的反写+项目名
artifactId:项目名称,一般为:项目名-模块名
version:版本号 形式为0.0.1-SNAPSHOT:
第一个 0 表示大版本号,第二个 0 表示分支版本号,第三个 0 表示小版本号
SNAPSHOT -- 快照版本(√),ALPHA -- 内侧版本,BETA -- 公测版本,RELEASE -- 稳定版本(√),GA -- 正式发布
packaging:打包的方式,如:pom(只做依赖管理,不写代码), jar, maven-plugin, ejb, war(带有前端页面的), ...
clissifier:用来帮助定义构件输出的一些附属构件。
2.4 自己项目的坐标
2.5 第三方项目坐标
3. 依赖
3.1 依赖的意义
当编写Java代码时,我们总是需要一些库,例如,做单元测试我们需要JUnit库。对于更大的项目,我们可能需要创建自己的库并在不同的部分使用它的项目。不同的项目需要不同版本的库。 保持项目最新的库JAR文件的正确版本不是一个容易的任务。
每个外部JAR可能还依赖于其他外部JAR文件等。以递归方式下载所有这些外部依赖JAR文件并确保下载正确的版本是一项巨大的任务。当项目越来越大,我们将需要越来越多的外部依赖。
Maven将下载它们并将它们放在您的本地Maven存储库中。我们可以在POM文件中dependencies元素内指定依赖关系。
3.2 依赖的使用
例如我们的项目需要进行单元测试,则需要使用到junit-4.9.jar包,使用maven引用该依赖的方式如下:
属性说明:
- 三维坐标:引用依赖包的三维坐标,用来定位该依赖包;
- scope: 控制该依赖包在什么情况下会被加到 classpath 中;
3.3 第三方依赖的查找方法
我们在不确定所需引用的第三方依赖包的坐标时,通过maven的中央仓库进行查找,网址: https://mvnrepository.com/;
以mybatis举例:
引入成功。
3.4 依赖范围
Maven项目在开发工程中有三套classpath
- 主代码:main下面的都是主代码在编译的时候的依赖
- 测试代码:test下是测试代码编译的时候的依赖
- 运行时:main代码在运行的时候对包的依赖
依赖范围的使用,通过在引用第三方依赖时的<scope></scope>标签进行设置,例如:
共 6 种 scope,包括:compile、provided、runtime、test、system、import。例如上图的junit,只在测试中使用,则选择test即可,默认为compile
- Compile:编译依赖范围。默认使用此依赖范围,其下的maven依赖,对于编译,测试,运行classpath都有效。
- Test:测试依赖范围。只对测试classpath有效,编译主代码或运行项目时无法使用此依赖。典型例子如junit。
- Provided:已提供依赖范围。其对于编译与测试classpath有效,运行时无效。如在web开发时,只有在编译和测试时才用到servlet-api,将其设置为此范围,在运行时servlet-api由web容器提供,无须依赖。并且在打war包时,此范围的依赖不会打在WEB-INF/lib下。
- Runtime:运行时依赖范围。与provided相对,运行时classpath有效。典型例子如jdbc(编写是接口规范运行是提供具体实现类需要jar包)。
3.5 依赖传递和可选依赖
3.5.1 依赖传递
应用场景:
第一直接依赖: HelloFriend项目依赖Hello项目
第二直接依赖: MakeFriend项目依赖HelloFriend项目
makeFriend项目只依赖了HelloFriend项目,但同时也把Hello项目依赖了进来。
3.5.2 依赖范围对传递依赖的影响
传递依赖是会受到依赖范围的影响的,具体来看结果如下:
3.5.3 依赖阻断
例如我们在HelloFriend项目里面的Hello依赖处添加该配置 :
<optional>true</optional>
我们可以看到makeFriend项目现在只引入了HelloFriend的依赖而没有引入Hello的依赖:
依赖阻断表示,当HelloFriend被其他项目依赖时,不传递Hello的依赖至依赖于HelloFriend的项目。
3.5.4 可选依赖
如果我们需要在依赖中明确的排除掉某一依赖,则可以使用exclusion属性,排除掉引用的依赖,如图:
可以看到,排除Hello后,依赖中就不会引入Hello。
4. 仓库
4.1 仓库的概念
在 Maven 的术语中,仓库是一个位置(place)。Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库。
在 Maven 中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
仓库的类型有:
- 本地(local)
- 中央(central)
- 远程(remote)
4.2 本地仓库
Maven 的本地仓库在安装 Maven 后并不会创建,它是在第一次执行 maven 命令的时候才被创建。运行 Maven 的时候,Maven 所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件。
默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/respository/ 的仓库目录。Maven 本地仓库默认被创建在 %USER_HOME% 目录下。要修改默认位置,在 %Maven_HOME%\conf 目录中的 Maven 的 settings.xml 文件中定义另一个路径。
4.3 中央仓库
Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到。
中央仓库的关键概念:
- 这个仓库由 Maven 社区管理。
- 不需要配置。
- 需要通过网络才能访问。
4.4 依赖搜索顺序
相关文章:

Maven进阶——坐标、依赖、仓库
目录 1.pomxml文件 2. 坐标 2.1 坐标的概念 2.2 坐标的意义 2.3 坐标的含义 2.4 自己项目的坐标 2.5 第三方项目坐标 3. 依赖 3.1 依赖的意义 3.2 依赖的使用 3.3 第三方依赖的查找方法 3.4 依赖范围 3.5 依赖传递和可选依赖 3.5.1 依赖传递 3.5.2 依赖范围对传…...
Android中的内存泄漏及其检测方式
Android中的内存泄漏及其检测方式 一、Android内存泄漏概述 在Android开发中,内存泄漏是一个常见且严重的问题。内存泄漏指的是在应用程序中,由于某些原因,已经不再使用的对象仍然被引用,导致垃圾回收器(Garbage Col…...
【雷电模拟器命令合集操作大全】官方文档整理贴
此贴是官方的帮助整理文档在这里插入代码片 一起来看看几个主要命令,大部分命令读者可以自己试试~ 1、launch 支持2种启动雷电模拟器的方式 –name顾名思义,应该是模拟器的标题栏的名字,本人经过验证果然如此! –index mnq_idx,模…...

redis的配置文件解析
我的后端学习大纲 我的Redis学习大纲 1.1.Redis的配置文件: 1.Redis的配置文件名称是:redis.conf 2.在vim这个配置文件的时候,默认是不显示行号的,可以编辑下面这个文件,末尾加上set nu,就会显示行号: 1.…...
Python中的元组和列表
Python 列表 Python有6个序列的内置类型,但最常见的是列表和元组。 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现。 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号…...

【AI战略思考7】粮草筹集完毕和我的朋友分类
注明:这是我昨晚12点多发布在朋友圈的,更新加工后的版本 粮草筹集完毕 统计完成 昨晚从7点半到晚上11点,借款的意向统计完成了,刚好凑够6个月😄,我觉得应该够了,我乐观估计是3个月内找到工作&…...

科大讯飞AI开发者大赛颁奖典礼,万码优才荣获前三甲!
在近日揭晓的科大讯飞AI开发者大赛中,万码优才APP凭借其卓越的技术实力、创新的应用方案以及深厚的行业洞察力,在上百个参赛队伍中脱颖而出,在AI Agent助力行业应用升级赛道荣获三甲排名!再次证明了其在人工智能领域的领先地位与无…...

Redis 哨兵机制
哨兵机制 哨兵机制的介绍 哨兵 (Sentinel) 先来看一下Redis Sentinel 相关名词解释: 在之前的主从复制中,存在一个问题,那就是当主节点挂了后,通过人工干预的方式来解决是比较繁琐且不那么靠谱的。 在实际开发中,对…...

linux-磁盘io情况、性能排查
命令安装 iostat属于sysstat软件包。可以直接安装。 yum install sysstat操作命令解析 iostat %user:CPU处在用户模式下的时间百分比。%nice:CPU处在带NICE值的用户模式下的时间百分比。%system:CPU处在系统模式下的时间百分比。%iowait&a…...

NC 单据模板自定义项 设置参照,比如部门参照、自定义参照等
NC 单据模板自定义项 设置参照(自定义参照) 一、如图下图,NC 单据模板自定义项 设置自定义参照: 1、选择需要设置参照的自定义字段,选择高级属性页签,在类型设置中,数据类型选择参照信息&#…...
table-cascade 使用
stable-cascade 使用教程 English 中文 1.安装最新版本的 Comyfui 2.将 https://huggingface.co/stabilityai/stable-cascade/tree/main 下面的 stage_b 和 stage_c 模型放到 ComfyUI/models/unet 下面 3.将 https://huggingface.co/stabilityai/stable-cascade/tree/main …...
Android SELinux——策略文件配置结构(八)
在 Android 系统中,SELinux 主要是通过一系列配置文件来进行管理和配置的。这些配置文件涵盖了策略定义、标签映射、签名信息等多个方面。 一、SeLinux文件体系 之前提到 Android 架构中大致包含 AOSP、厂商、Vendor 等部分。在 Android 8 以上的系统中,AOSP 和厂商、供应商…...

【数据结构与算法】队列——数据世界中的“有序使者”
大家好,我是小卡皮巴拉 文章目录 目录 引言 一.队列的基本概念 1.1 队列的定义 1.2 队列的特性 1.3 队列的基本操作 二.队列的实现方式 2.1 基于链表的队列 2.2 基于数组的队列 三.基于链表的队列实现 定义链表队列的结构 初始化 入队列——向队列中插…...

yolov11 部署 TensorRT,预处理和后处理用 C++ cuda 加速,速度快到飞起
之前搞过不少部署,也玩过tensorRT部署模型(但都是模型推理用gpu,后处理还是用cpu进行),有网友问能出一篇tensorRT用gpu对模型后处理进行加速的。由于之前用的都是非cuda支持的边缘芯片,没有写过cuda代码&am…...

国际期货收费行情源CTP推送式/期货配资软件开发对接行情源的技术性说明
在现代金融市场中,期货交易因其高风险和高回报特性而备受关注。为了满足期货交易者的需求,开发高效、稳定和安全的期货交易软件变得尤为重要。本文将对国际期货收费行情源CTP推送式及期货配资软件的开发对接行情源的技术细节进行详细说明。 一、CTP&…...

上拉电阻和下拉电阻在电路中的作用(一)
上拉电阻和下拉电阻在电路中的作用(一) 1.什么是上下拉电阻2.上下拉电阻的作用:2.1.维持输入引脚处于稳定状态。2.2.配合三极管和MOS进行电平转换电路设计2.3.OC、OD电路(Open Collector集电极开路、Open Drain漏电极开路…...

怎么轻松把图片存入二维码?图片生成二维码的简单3步技巧
进入数字化时代,图片是目前应用广泛的一种信息传递方式,可以通过看图来获取需要的内容,那么图片如何更快捷的在更多人之间传递呢?通过将图片生成二维码后分享,可以实现图片的快速传递,制作成本也比较低&…...
perl双引号内字符串的反斜线转义
perl双引号内字符串的反斜线转义 如题,下面表格列举了perl双引号内字符串的反斜线转义: 组合意义\n换行\r回车\t水平制表符\f换页符\b退格\a系统响铃\eEsc(ASCII编码的转义字符)\007八进制表示的ASCII值(此例中007表…...
【编程语言】Kotlin快速入门 - 伴生对象与懒加载
静态与顶层方法 静态方法(伴生对象) Java中有静态方法的概念,但是在Kotlin中这个静态方法被弱化了,还记得我们使用object创建一个单例类吗,创建的单例类我们当时可以使用像静态方法一样的调用方式取调用,…...
三、数据聚合和函数
在数据聚合和函数方面,数据库提供了许多功能强大的函数,可以帮助你处理和分析数据。以下是一些常用的函数及其功能的详细说明: COUNT函数: COUNT函数用于计算指定列中的行数。它可以用于统计表中满足特定条件的行数,也…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...