什么是Maven
定义:Maven是一个项目管理工具.基于POM(项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件.
大白话:Maven是一个项目管理工具,通过pom.xml文件的配置获取jar包.
为什么要学Maven
一句话:简单,方便,提高我们的开发效率,减小我们的开发BUG.
Maven提供的功能非常多,这里终点讲两个方面:1.项目构建 2.管理依赖
Maven核心功能
项目构建
Maven提供了标准的,跨平台的自动化项目构建方式.
当我们开发了一个项目之后,代码需要经过编译,测试,打包,发布等过程,每次代码的修改,都需要经过这些流程,如果代码反复调试修改,这个流程就需要反复进行,就显得特别麻烦,而Maven给我们提供了一套简单的命令来完成项目的构建.
形如这些就是Maven提供的命令,在idea左上角点击maven可以找到.
比如:package命令就是项目的打包操作.(打包就是把所有class文件,全部放一起,打成jar包或war包)
jar包和war包都是一种压缩文件
jar包就是把开发人员写好的一些代码进行打包.打好的jar包就可以引入到其它项目中,也可以直接使用这些jar包中的类和属性.另外也可以打成可执行jar包,这样的包就可以通过java-jar命令执行.
war包可以理解为是一个web项目,里面是项目的所有东西,通常用于网站.
依赖管理
上面说到,Mave是一个项目管理工具,通过pom.xml文件的配置获取jar包,而不是手动添加jar包,获取的jar包,其实就是依赖.
pom.xml就是maven的配置文件, 用以描述项目的各种信息.
依赖配置
依赖:指当前项目运行所需要的jar包.
如果使用Maven,我们只需要在pom.xml中引入mysql-connector-java依赖就可以了
<dependencies>
<!--里面放置项目的依赖坐标,可以为多个-->
</dependencies>
1.在pom文件<dependencies>标签内,添加依赖坐标.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
2.点击刷新按钮,引入新加入的依赖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,也可以通过排除依赖的方式来实现.
排除依赖:指主动断开依赖的资源.(被排除的资源无需指定版本).
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>6.0.6</version>
<!--排除依赖-->
<exclusions>
<exclusion>
<artifactId>spring-jcl</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
maven还有一些功能是依赖调解,可选依赖等.
依赖调解:
当项目中的依赖存在依赖冲突时(比如上图,Jar C一个版本是1.0,另一个版本是2.0,两个版本不一致可能会引起冲突),例如存在这样的依赖:
A->B->C->X(1.0)
A->D->X(2.0)
Maven会采用最短路径优先的原则去选择依赖,这里的2路径更短,所以我们会选择X(2.0),当然我们也可以选择指定某个依赖的版本.
当然也可以指定X的版本.
Maven仓库
我们通过短短几行代码,就把依赖jar包放在了项目里,具体是如何做的呢?
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
这个代码,我们称之为"坐标",也就是唯一的.
在Maven中,根据groupId,artifactId,version的配置,来唯一识别一个jar包,缺一不可.
当我们在pom文件中配置完依赖之后,点击刷新,Maven会根据坐标的配置,去仓库里寻找jar包,并把它下载下来,添加到项目中.这个Jar包下载的地方就叫仓库.
仓库:用于存储资源,管理各种jar包.
Maven仓库的本质就是一个目录(文件夹),这个目录被用来存储开发中的所有依赖(jar包,插件等).
仓库分为两大类:本地仓库和远程仓库.其中远程仓库又分为中央仓库,私服和其它仓库.
本地仓库
本地仓库:自己计算机上的一个目录(用来存储jar包).
当项目中引入对应依赖的jar包后,首先会查找本地仓库中是否有对应的jar包.
如果有,则在项目中直接引用.
如果没有,则去中央仓库中下载对应的jar包到本地仓库.
中央仓库
中央仓库:maven软件中内置一个远程仓库地址,就是中央仓库,服务于整个互联网.由maven团队维护,全球唯一.
仓库地址:https://repo1.maven.org/maven2/
我们可以把自己写好的Jar包上传到中央仓库(具备一定的要求) ,也可以从中央仓库中下载jar包.
私有服务器(私服)
私服:一般由公司团队搭建的私有仓库.
私服属于某个公司,或者某个部门,往往需要一定的权限.
有了私服之后,Maven依赖下载的顺序又发生了变化.
当Maven需要下载资源时
1.先从本地仓库获取,本地仓库存在,则直接返回
2.如果本地仓库中没有,就从私服请求,私服存在该资源,就直接返回了
3.如果私服上不存在该资源,则从中央仓库下载,中央仓库不存在,就报错了.
4.如果中央仓库中存在,就先缓存在私服上之后,再缓存到本地仓库里,再为Maven的下载请求提供服务.
私服是很多人在使用的,所以只需要第一个使用者下载一次就可以了.