Maven

什么是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依赖就可以了

 

1.在pom文件标签内,添加依赖坐标.

mysqlmysql-connector-java8.0.30

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,也可以通过排除依赖的方式来实现.

排除依赖:指主动断开依赖的资源.(被排除的资源无需指定版本). 

 org.springframework spring-core 6.0.6    spring-jcl org.springframework  

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包放在了项目里,具体是如何做的呢?

 mysqlmysql-connector-java8.0.30

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

在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的下载请求提供服务. 

私服是很多人在使用的,所以只需要第一个使用者下载一次就可以了.