【Java EE】关于Maven
文章目录
- 🎍什么是Maven
- 🌴为什么要学Maven
- 🌲创建⼀个Maven项目
- 🌳Maven核心功能
- 🌸项目构建
- 🌸依赖管理
- 🍀Maven Help插件
- 🎄Maven 仓库
- 🌸本地仓库
- 🌸私服
- ⭕总结
🎍什么是Maven
Maven是⼀个项⽬管理⼯具。基于POM(Project Object Model,项⽬对象模型)的概念,Maven可以通过⼀⼩段描述信息来管理项⽬的构建,报告和⽂档的项⽬管理⼯具软件。
大白话:Maven是⼀个项⽬管理⼯具,通过pom.xml⽂件的配置获取jar包,⽽不⽤⼿动去添加jar包
🌴为什么要学Maven
为了简单,⽅便,提⾼我们的开发效率,减少我们的开发Bug.
🌲创建⼀个Maven项目
IDEA本⾝已经集成了Maven, 我们可以直接使⽤, ⽆需安装
以下截图的idea版本为: 2022.1.4, 不同版本的idea界⾯展⽰会有所不同
File -> New -> Project

点击 Create, 就创建好了⼀个Maven项⽬

如果Maven jar包下载失败,可以参考博主写的
【Java EE】Maven jar 包下载失败问题的解决方法
🌳Maven核心功能
Maven提供的功能⾮常多,Maven在项⽬开发中的作⽤.
主要体现在两个⽅⾯:
- 项⽬构建
- 管理依赖
🌸项目构建
Maven提供了标准的,跨平台(Linux,Windows,MacOS等)的⾃动化项⽬构建⽅式,当我们开发了⼀个项⽬之后,代码需要经过编译,测试,打包,发布等流程,每次代码的修改,都需要经过这些流程,如果代码反复调试修改,这个流程就需要反复进⾏,就显得特别⿇烦,⽽Maven给我们提供了⼀套简单的命令来完成项⽬的构建.

⽐如, 点击package, 就可以完成


打包就是把所有的class⽂件, 全部放在⼀起, 打成jar包或者war包
jar包和war包都是⼀种压缩⽂件
jar包就是把开发⼈员已经写好的⼀些代码进⾏打包. 打好的jar包就可以引⼊到其他项⽬中, 也可以直
接使⽤这些jar包中的类和属性. 另外也可以打成可执⾏jar包, 这样的包就可以通过java -jar命令来执
⾏
war包可以理解为是⼀个web项⽬,⾥⾯是项⽬的所有东西, 通常⽤于⽹站.
🌸依赖管理
上⾯说到, Maven是⼀个项⽬管理⼯具, 通过pom.xml⽂件的配置获取jar包,⽽不⽤⼿动去添加jar包
获取的jar包, 其实就是依赖
pom.xml就是maven的配置⽂件,⽤以描述项⽬的各种信息
🌻依赖配置
而我们一般是需要对pom.xml中引⼊相应的依赖。
⽐如博主在前面讲JDBC编程时,我们需要⼿动下载mysql-connector-java的包.并且添加到项⽬中.

如果使⽤Maven,我们只需要在pom.xml中引⼊mysql-connector-java的依赖就可以了
<dependencies>
<!--⾥⾯放置项⽬的依赖坐标, 可为多个 -->
</dependencies>
在pom⽂件 标签内,添加依赖坐标
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version>
</dependency>
点击刷新按钮,引⼊新加⼊的依赖jar包
后续有添加新的jar包,或者修改jar包版本,都需要通过该⽅式在项⽬中添加依赖.

🌻依赖传递
早期我们没有使⽤maven时,向项⽬中添加依赖的jar包,需要把所有的jar包都复制到项⽬⼯程下.⽐如A依赖B,B依赖C,那么A项⽬引⼊B的同时,也需要引⼊C,如果我们⼿动管理这个依赖,这个过程就会⽐较⿇烦,我们需要知道每个库都依赖哪些库,以及这些依赖之间的版本是如何关联的
⽐如我们要吃⽕锅,需要有锅,有调料,有⻝材,以及确认什么样的锅,什么样的⻝材.
⽐如去医院看病,需要带上以往的病历,检查结果,处⽅等,并且要确认带的资料是正确的,如果⽇期错了,或者患者错了,带少了,就需要回去重新拿
但使⽤maven的话,就可以避免管理所需依赖的关系。我们只需要在pom⽂件中,定义直接依赖就可以了,由于maven的依赖具有传递性,所以会⾃动把所依赖的其他jar包也⼀起导⼊
⽐如吃⽕锅,现在我们可以点⼀个海底捞外卖,直接就把所有⻝材都送过来了,包括什么锅,配什么菜.⽐如去医院看病,借助"互联⽹",实现了信息共享,只需要带上⾝份证,以往的病历和检查结果就都可以看到了

如上图,项⽬A通过Maven引⼊Jar A时,会⾃动引⼊Jar B 和Jar C.
Jar A 和项⽬B就是项⽬A的直接依赖.
Jar B, Jar C是间接依赖.
🌻依赖排除
排除依赖: 指主动断开依赖的资源。(被排除的资源⽆需指定版本)
当前阶段我们需要依赖的库并不多,但随着项⽬的越来越复杂,库之间的依赖关系也会变得越来越复杂.
⽐如,我下了⼀个快递单⼦,默认会有⼀个服务,就是快递⼩哥会上⻔取件,但是我刚好要出⻔,⽽且顺路经过站点,也可以选择⾃⼰送过去
如上面所讲, 如果项⽬A不需要Jar B,也可以通过排除依赖的⽅式来实现.
🍀Maven Help插件
当项⽬⽐较复杂时,我们就会有Jar包冲突的问题,这时候就需要去解决依赖冲突.解决冲突之前,需要先找到冲突,我们可以使⽤Maven Help插件来观察包和包之间的依赖关系
安装插件:File -> Settings ->Plugins -> 搜索Maven Help -> 找到对应插件, 点击Install 安装即可, 安装后需要重启下idea,才能⽣效
理解 “插件” (plugin)
天⽕ + 擎天柱 => 会⻜的擎天柱.
天⽕在牺牲之前把⾃⼰变成了擎天柱的 “⻜⾏插件”. 在擎天柱需要起⻜的时候就变成翅膀装在擎天柱
⾝上. 不需要起⻜的时候就卸下来放到擎天柱的集装箱⾥.
程序开发的时候也经常如此.
像 IDEA 这样的程序虽然功能强⼤, 但是也⽆法⾯⾯俱到. 对于⼀些特殊场景的功能, 开发者就可以开
发⼀些 “插件”. 如果需要这个插件, 就单独安装
插件就是对程序的⼀些特定场景, 做出⼀些特定的功能的扩展

安装之后, 打开pom⽂件, 可以看到Jar包之间的依赖关系

也可以右键排除掉⼀些依赖

🎄Maven 仓库
我们通过短短⼏⾏代码,就把依赖jar包放在了项⽬⾥,具体是如何做的呢?
比如我们上面导入的mysql的jar包
这个代码,我们称之为"坐标",也就是唯⼀的.
在Maven中,根据groupId、artifactId、version的配置,来唯⼀识别⼀个jar包,缺⼀不可.
当我们在pom⽂件中配置完依赖之后,点击刷新,Maven会根据坐标的配置,去仓库⾥寻找Jar包,并把他下载下来,添加到项⽬中.这个Jar包下载的地⽅就称为仓库.仓库:⽤于存储资源,管理各种jar包
Maven仓库分为两⼤类:本地仓库和远程仓库.其中远程仓库⼜分为中央仓库,私服和其他公共库
Maven仓库的本质就是⼀个⽬录(⽂件夹),这个⽬录被⽤来存储开发中所有依赖(jar包, 插件等).
🌸本地仓库
本地仓库:⾃⼰计算机上的⼀个⽬录(⽤来存储jar包)
当项⽬中引⼊对应依赖jar包后,⾸先会查找本地仓库中是否有对应的jar包
• 如果有,则在项⽬直接引⽤
• 如果没有,则去中央仓库中下载对应的jar包到本地仓库

本地仓库地址可以通过Maven配置查看:
File -> Settings

中央仓库
中央仓库:maven 软件中内置⼀个远程仓库地址,就是中央仓库,服务于整个互联⽹.由Maven团队维护,全球唯⼀.
仓库地址:https://repo1.maven.org/maven2/
可以通过https://mvnrepository.com这个⽹站来查询并下载
那我们如何查找我们想要的jar包呢?可以分为以下三步
查找Jar的坐标
- 访问https://mvnrepository.com/
- 进⾏查找,⽐如mysql

- 选择要添加的Jar包版本

4. 查看Jar包对应坐标

🌸私服
私有服务器,也称为私服
私服:⼀般由公司团队搭建的私有仓库.
私服属于某个公司,或者某个部⻔,往往需要⼀定权限.
有了私服之后,Maven依赖下载的顺序⼜发⽣了变化

当Maven需要下载资源的时候
- 先从本地仓库获取,本地仓库存在,则直接返回
- 如果本地仓库没有,就从私服请求,私服存在该资源,就直接返回
- 如果私服上不存在该资源,则从中央仓库下载,中央仓库不存在,就报错了…
- 如果中央仓库中存在,就先缓存在私服上之后,再缓存到本地仓库⾥,再为Maven的下载请求提供服务
⭕总结
感谢大家的阅读,希望得到大家的批评指正,和大家一起进步,与君共勉!
相关文章:
【Java EE】关于Maven
文章目录 🎍什么是Maven🌴为什么要学Maven🌲创建⼀个Maven项目🌳Maven核心功能🌸项目构建🌸依赖管理 🍀Maven Help插件🎄Maven 仓库🌸本地仓库🌸私服 ⭕总结 …...
每日一题:C语言经典例题之反转数
题目描述 给定一个整数,请将该数各个数位上的数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零。 题目描述 给定一个整数,请将该数各个数位上的数字反转得到一个…...
RESTfull接口访问Elasticsearch
【数据库的健康值】 curl -X GET "ip:9200/_cat/health" 【查看所有索引】 curl -X GET "ip:9200/_cat/indices?v" 【查看索引index_name】 curl -X GET "ip:9200/索引?pretty" 【创建索引/文档】 PUT "ip:9200/索引/文档id" {请…...
NoSQL之Redis
目录 一、关系型数据库与非关系型数据库 1.关系数据库 2.非关系数据库 2.1非关系型数据库产生背景 3.关系型数据库与非关系型数据区别 (1)数据存储方式不同 (2)扩展方式不同 (3)对事物性的支持不同 …...
double二分(P3743 小鸟的设备)
题目:P3743 小鸟的设备 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码: #include<bits/stdc.h> using namespace std; const int N2e510; double a[N],b[N]; int n; double p;bool check(double mid) {double sum0.0;for(int i1;i<n;i){if(a[i]*mi…...
【独立开发前线】Vol.36 为什么从2023年开始,独立开发者越来越多了?
不知道你有没有观察到,从2023年开始,国内的独立开发者越来越多了。 之前独立开发者是一个非常小众的群体,但现在很多互联网从业者都瞄准了这个方向,包括程序员、产品经理,运营等等。 我想可能是这样几个原因…...
GPT4不限制使用次数了!GPT5即将推出了!
今天登录到ChatGPT Plus账户,出现了如下提示: 已经没有了数量和时间限制的提示。 更改前:每 3 小时限制 40 次(团队计划为 100 次);更改后:可能会应用使用限制。 GPT-4放开限制 身边订阅了Ch…...
物联网实战--入门篇之(六)嵌入式-WIFI驱动(ESP8266)
目录 一、WIFI简介 二、基础网络知识 三、思路讲解 四、代码分析 4.1 状态机制 4.2 客户端连接 4.3 应用数据接收处理 4.4 数据发送 4.5 主函数调用 4.6 网络连接ID分配 五、总结 一、WIFI简介 WIFI在我们生活中太常见了,手机电脑都可以用WiFi连接路由器进行上…...
Java并发编程基础面试题详细总结
1. 什么是线程和进程? 1.1 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。 在 Java 中,当我们启动 main 函数时其实就是启动了一个…...
EKO / 砍树
暴力是不行的,还得是二分吧 题目描述 伐木工人 Mirko 需要砍 M 米长的木材。对 Mirko 来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一般砍伐森林。不过,Mirko 只被允许砍伐一排树。 Mirko 的伐木机工作流程如下&a…...
Kafka面试宝典
1 Kafka基础面试篇 Kafka的那些设计让它有如此高的性能? 1.partition,producer和consumer端的批处理:提高并行度;2.页缓存:大量使用页缓存,内存操作比磁盘操作快很多,数据写入直接写道页缓存,由操作系统负责刷盘,数据读取也是直接命中页缓存,从内存中直接拿到数据;…...
Redis性能管理
目录 1、内存碎片如何产生的? 2、跟踪内存碎片率对理解Redis实例的资源性能是非常重要的 3、解决碎片率大的问题 二、内存使用率 1、避免内存交换发生的方法 2、内回收key 三、缓存的穿透、击穿、雪崩 #查看Redis内存使用方法 info memory #进入数据库查看 re…...
计算机网络:局域网的数据链路层
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
Linux常见命令简介
Linux运行级别 六种运行级别: 0、关机 1、单用户(可用来找回密码) 2、多用户无网络 3、多用户有网络(多用于工作环境) 4、预留 5、图形界面(多用于学习环境) 6、重…...
34-SDK设计(下):IAM项目GoSDK设计和实现
比如 Kubernetes的 client-go SDK设计方式。IAM项目参考client-go,也实现了client-go风格的SDK:marmotedu-sdk-go。 ,client-go风格的SDK具有以下优点: 大量使用了Go interface特性,将接口的定义和实现解耦࿰…...
基于Matlab的血管图像增强算法,Matlab实现
博主简介: 专注、专一于Matlab图像处理学习、交流,matlab图像代码代做/项目合作可以联系(QQ:3249726188) 个人主页:Matlab_ImagePro-CSDN博客 原则:代码均由本人编写完成,非中介,提供…...
LeetCode每日一题之专题一:双指针 ——复写零
复写零OJ链接:1089. 复写零 - 力扣(LeetCode) 题目: 解法(原地复写-双指针): 算法思路: 如果「从前向后」进⾏原地复写操作的话,由于 0 的出现会复写两次,导致…...
Golang基础-9
Go语言基础 介绍 基础 结构体 自定义类型 结构体定义 结构体声明 结构体初始化 字段访问与修改 匿名结构体 结构体嵌套 初始化函数定义 介绍 本文介绍Go语言中自定义类型、结构体定义、结构体声明、结构体初始化、字段访问与修改、匿名结构体、结构体嵌套、初始化…...
Vue基础知识:路由的封装抽离,路由模块的封装抽离的好处是什么?,如何快速的引入组件,基于@指代src目录,从src目录出发找组件
如果将所有的路由配置都存放在main.js中,是非常有问题的,杂且乱。所以我们要将路由模块进行抽离,这样有利于:拆分模块,利于维护。大致的做法就是将路由相关的东西放到router这个文件夹的index.js中,而将来只…...
插入排序---算法
1、算法概念 插入排序:它的工作原理是通过构建有序排序,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置插入。 2、算法步骤 将第一待排序序列第一个元素看作一个有序序列,把第二个元素到最后一个元素当成是…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
