Java学习 - Maven - 仓库、坐标及依赖管理

前言

在 Maven 项目中,pom.xml 文件扮演着至关重要的角色,它是 Maven 构建系统和项目信息的核心。

pom.xml 作为 Maven 项目的导航,不仅定义了项目的基本信息和构建规则,还管理了项目的依赖关系和插件使用。通过合理配置 pom.xml,开发者可以确保项目的构建、测试和部署过程自动化、标准化,从而提高开发效率和项目质量。

Maven 仓库

所谓仓库,就和我们平常说的粮仓啥的差不多,其实都是用来存放东西的。只不过在 Maven 项目中,仓库使用来存放我们项目所使用的 jar 包以及 Maven 所使用的各种 jar 包的。

而根据仓库存放位置的不同,我们可将其分为 本地仓库 和 远程仓库。

其中,本地仓库也就是我们个人 PC 中存放 jar 包的文件夹,用于存放 Maven 项目所需的 jar。

而远程仓库则指的是存放在互联网中的仓库,我们可以将其进一步细分为 中央仓库、中央仓库镜像、私服。

  • 中央仓库:全世界最权威的一个仓库,我们所有的开发人员都可以共享使用,地址为:https://repo.maven.apache.org。
  • 中央仓库镜像:顾名思义,它就是中央仓库的一个备份,它分散在各大洲的重要城市,方便各个地方的程序员使用起来更快捷。
  • 私服:私服则是处于安全考虑,一般搭建在局域网中,仅提供给公司内部人员使用。

那我们如何使用仓库呢?或者说一个 Maven 项目从仓库中获取资源的顺序是怎样的呢?

通常来讲,当我们要使用 Maven 仓库中的资源时,是不需要我们去人为干预的。假设我们要使用某一个驱动,我们首先去 pom.xml 中进行配置,接着 Maven 将自动先去检查我们的本地仓库中是否存在该资源,如果没有,那么就到私服中午查找,如果还没有找到,那么就到中央仓库镜像中去查询,最后如果连镜像仓库中也没法找到,那就只有到中央仓库去进行搜索了。

Maven 坐标

坐标,其实就相当于我们人的身份证,它是唯一的,用于标识一个项目。一个坐标的组成一般有如下几部分,前三者必须,packaging 可选,classifier 不能直接定义。

  • groupId:定义 Maven 项目隶属的实际组织,一般约定以创建该项目的组织名称的逆向域名开头。比如说公司的域名是:google.com,那么我们就可以将 groupId 设置为 com.google。
  • artifactId:定义实际项目中的一个 Maven 项目(模块),推荐使用实际项目名作为前缀。
  • version:定义 Maven 项目当前所处版本,一般使用三位数字进行标识,如 1.1.1。
  • packaging:项目打包方式,可以是 jar、war、rar、ear、pom,默认使用 jar。
  • classifier:帮助定义构建输出的一些附属构建,与主构件对应。
  • dependencies:添加项目所需的 jar 所对应的 Maven 坐标,,表示我们项目中所需的各种资源说明。
  • dependency:dependencies 的一个子标签,一个 dependency 对应一个坐标。
  • properties:用于设置属性。
  • scope:表示依赖的范围,通常有如下几种:
依赖范围编译期有效测试期有效运行时有效打包有效
compile😄😄😄😄
test😡😄😡😡
privided😄😄😡😡
runtime😡😄😄😄
system😄😄😡😡

以下就是一个最简单的 Maven 坐标实例:

<groupId>com.cunyu</groupId>
<artifactId>MavenDemo</artifactId>
<version>1.1.1</version>

依赖冲突

冲突产生原因

Maven 项目中,通常都会定义血多 dependency,每个 dependency 内部也会定义它的 dependency,而有时各个依赖之间会产生冲突,冲突的原因通常主要是 由于 jar 包依赖的传递性,如果在一个项目中同时引入了一个依赖的不同版本,就可能导致依赖冲突。

解决冲突的办法

当冲突产生时,需要如何解决呢?通常我们有两种处理策略:

  • Maven 的默认处理策略:
  1. 最短路径优先:对于不同路径长度的 jar 包,优先选择路径更短的生效。
  2. 最先声明优先:当路径一样时,如 A -> B -> C ,E -> F -> C,那么则谁先声明则先选择谁生效。
  • 移除依赖:用于排除某项依赖的依赖包

除开上述策略外,我们也可以手动在 pom.xml 中使用 <exclusion> 标签来排除发生冲突的依赖包,如下面用于排除 spring-core 冲突的例子:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.9.RELEASE</version><exclusions><exclusion><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></exclusion></exclusions>
</dependency>

总结

今天的文章为我们提供了关于 Maven 仓库和坐标的深入知识,以及如何处理 Maven 中的依赖冲突问题。这些知识点对于理解和使用 Maven 至关重要。

如果你对 Maven 的仓库、坐标或依赖管理有更多的见解或经验,欢迎在评论区分享和交流。这样的互动不仅能帮助他人,也能加深你对 Maven 的理解。

期待下一次的 Maven 实战分享,让我们将所学知识应用到实践中,进一步提升我们的 Maven 使用技能。如果你觉得今天的内容对你有帮助,别忘了点赞和关注,以获取更多高质量的 Maven 教程和实战技巧。

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

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

相关文章

pdf压缩文件怎么压缩最小,软件工具压缩清晰

PDF格式的文件&#xff0c;当其体积过于庞大时&#xff0c;确实在上传的过程中显得尤为不便。今天给大家分享一个压缩pdf的简单的方法&#xff0c;让大家可以轻松的压缩pdf。 浏览器打开 "轻云处理pdf官网" &#xff0c;上传pdf文件&#xff0c;文件上传完成后网站会…

Mysql使用中的性能优化——索引对插入操作的性能影响

当我们往表中插入数据时&#xff0c;如果表中有索引&#xff0c;则会给插入操作增加更多的工作量。带来的好处是可以提升查询效率。但是这种优劣该如何权衡&#xff0c;则需要通过数据对比来提供佐证。本文我们将对比没有索引、有一个普通索引、有一个唯一索引的性能差距。 结…

C# WPF入门学习主线篇(十一)—— 布局管理

C# WPF入门学习主线篇&#xff08;十一&#xff09;—— 布局管理 欢迎来到C# WPF入门学习系列的第十一篇。在前面的文章中&#xff0c;我们已经探讨了WPF中的许多控件及其属性和事件。今天&#xff0c;我们将开启一个新的篇章——布局管理。布局管理是WPF中一个至关重要的概念…

AGP4+ 打包运行闪退,AGP7+ 正常(has code but is marked native or abstract)

问题 安装应用&#xff0c;点击图标启动立马闪退&#xff01; 诡异的闪退&#xff1a;AGP4 打包运行闪退&#xff0c;AGP7 正常 unity 导出的 Android 日志两个主要点&#xff1a; com.android.boot.App 是 Android 的 application 子类&#xff0c;程序入口 java.lang.Class…

数据库-列的完整性约束-概述

引言 我们都知道人以群分 &#xff0c;但分为 若按照 人类的皮肤分类 黄种人&#xff08;其实是西方人定义&#xff09;我们虽然不承认也不否定 &#xff0c;黑皮肤 &#xff0c;棕色人种&#xff08;在南太平洋和西太&#xff09;白种人 排名你懂的 这好像是枚举类型 emm 尴尬…

TiDB Distributed NewSQL Database

TiDB 的全称是 TiDB Distributed NewSQL Database&#xff0c;即 TiDB分布式NewSQL数据库。它是一个开源的分布式关系型数据库&#xff0c;结合了传统关系型数据库&#xff08;RDBMS&#xff09;的 ACID 事务特性以及 NoSQL 数据库的分布式水平扩展能力。通过 TiDB&#xff0c;…

23种模式之一— — — —适配器模式的详细介绍与讲解

适配器介绍与讲解 一、概念二、适配器模式结构适配器分类核心思想核心角色模式的UML类图应用场景模式优点模式缺点 实例演示图示代码演示运行结果 一、概念 适配器模式&#xff08;别名&#xff1a;包装器&#xff09; 是一种结构型设计模式 将一个类的接口转换成客户希望的另…

axios的用法

当然&#xff0c;axios是一个非常流行的基于Promise的HTTP客户端&#xff0c;用于浏览器和node.js中发送请求。下面我会用分点的方式来介绍axios的用法&#xff1a; 安装axios 在你的项目中&#xff0c;你可以通过npm或yarn来安装axios。打开终端并执行以下命令之一&#xff…

Linux ip命令常用操作

ip 命令来自 iproute2 软件包&#xff0c;在 CentOS 7 中默认已安装&#xff08;yum install -y iproute&#xff09;。 iproute2 软件包提供了很多命令&#xff08;rpm -ql iproute |grep bin&#xff09;&#xff0c;如 ss 命令、bridge&#xff0c;这些命令可以完全替代 if…

学生宿舍人走断电系统的开发

学生宿舍人走断电管理系统是一款智能化的电力管理设备&#xff0c;旨在解决学生宿舍用电问题。以下是一些该系统的功能特点: 1.智能控制:系统能够自动识别宿舍内是否有人&#xff0c;当无人时自动断电&#xff0c;避免能源浪费和事故的发生。 2.:系统具有过载保护、短路保护、过…

html常见的表单元素有哪些,html表单元素有哪些?

HTML中常用的表单元素包括&#xff1a;文本区域(TEXTAREA)&#xff0c;列表框(SELECT)&#xff0c;文本输入框(INPUT typetext)&#xff0c;密码输入框(INPUT typepassword)&#xff0c;单选输入框(INPUT typeradio)&#xff0c;复选输入框(INPUT typecheckbox)&#xff0c;重置…

WebSocket面试常见知识点和面试题

目录 什么是WebSocket,它与HTTP协议有何不同? WebSocket连接是如何建立的,描述一下WebSocket的握手过程。 WebSocket支持哪些类型的数据传输? WebSocket协议使用哪些URL模式? 描述WebSocket的事件循环以及相关的事件类型。 如何在客户端使用JavaScript创建WebSocket…

React nginx配置,一个端口代理多个项目(转发后找不到CSS,JS及图片资源问题解决)

场景&#xff1a; nginx 配置负载均衡&#xff0c;甲方只提供一个端口&#xff0c;一个域名地址 方法&#xff1a; 一个端口一个域名匹配多个应用 方法一&#xff1a; 依靠设备浏览器区分: 使用UserAgent头来识别用户的客户端, CDN监测vary头的信息&#xff0c;如果内容不一致…

OCP-042之:Oracle结构体系

1. Oracle结构体系 1.1 概述 1.1.1 版本 版本后缀所代表的含义 i:代表基于Internet架构的数据库,如9i g:代表基于grid(网格)的数据库,如11g grid的目的:降低成本,提高服务质量,简化管理 Storage Grid:ASM(automatic storage management),继承了LVM技术,Oracl…

16_ Vue.js高级指南:条件渲染、列表渲染与数据双向绑定

文章目录 1. 条件渲染v-if2. 列表渲染v-for3. 数据双项绑定v-model4. 计算属性Appendix 1. 条件渲染v-if v-if标签直接接收函数或boolean类型变量 v-if 为true&#xff0c;则当前元素会进入到dom树v-else会自动执行 前方v-if的取反操作 v-show v-show值为true则值展示值不展示…

Linux配置uwsgi环境

Linux配置uwsgi环境 1.进入虚拟环境 source /envs/django_-shop-system/bin/activate2.安装uwsgi pip install uwsgi3.基于uwsgi运行项目 – 基于配置文件 在项目目录下创建配置文件 #socket 0.0.0.0:8005 http 0.0.0.0:8005 # http120.55.47.111:8005 chdir/opt/www/djang…

51单片机-独立按键控制灯灯灯

目录 简介: 一. 1个独立按钮控制一个灯例子 二. 在加一个独立按键,控制第二个灯 三. 第一个开关 开灯, 第二个开关关灯 四. 点一下开灯,在点一下关灯 五. 总结 简介: 51 单片机具有强大的控制能力&#xff0c;而独立按键则提供了一种简单的输入方式。 当把独立按键与 …

LeetCode72编辑距离

题目描述 解析 一般这种给出两个字符串的动态规划问题都是维护一个二维数组&#xff0c;尺寸和这两个字符串的长度相等&#xff0c;用二维做完了后可以尝试优化空间。这一题其实挺类似1143这题的&#xff0c;只不过相比1143的一种方式&#xff0c;变成了三种方式&#xff0c;就…

java中关于>>>一点理解

如果两个int类型的非常大的整数相加&#xff0c;得到的结果很有可能是一个负数&#xff0c;因为在Java中对数字的计算是将数字转换成二进制进行计算的&#xff0c;并且Java会将得到的二进制结果的最高位看成符号位&#xff0c;从而导致得到负数&#xff0c; 举个例子&#xff…

微型丝杆与滚珠丝杆性能差异与适用场景!

滚珠丝杆是工具机械和精密机械上最常使用的传动元件&#xff0c;其主要功能是将旋转运动转换成线性运动&#xff0c;或将扭矩转换成轴向反复作用力。同时兼具高精度、可逆性和高效率的特点。而微型丝杆是一种直径为0.5mm以下且线性误差在几微米以内&#xff0c;精度高、传动稳定…