1. Maven
1.1 什么是 Maven
官方对于 Maven 的描述:
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
引用自:https://maven.apache.org/index.html
翻译过来就是:
Maven 是一个项目管理工具。基于 POM(ProjectObjectModel,项目对象模型)的概念,Maven 是可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
说人话就是:Maven 是一个项目管理工具,通过 pom.xml 文件的配置获取 jar 包,而不用手动去添加 jar 包
1.2 为什么用 Maven
一句话:简单、方便、提高我们的开发效率,减少我们的开发 Bug
Maven 提供的功能非常多,Maven 在本文中的主要体现是以下两个方面:
- 项目构建
- 管理依赖
1.3 创建一个 Maven 项目
1.4 Maven 核心功能
Maven 提供了标准的,跨平台(Linux、Windows、MacOS等)的自动化项目构建方式
当我们开发了一个项目之后,代码需要经过编译、测试、打包、发布等流程,每次代码的修改,都需要经过这些流程,如果代码反复调试修改,这个流程就需要反复进行,就显得特别麻烦,而 Maven 给我们提供了一套简单的命令来完成项目的构建
点击 package 就可以完成项目的打包操作
打包就是把所有的 class 文件,全部放在一起,打成 jar 包或 war 包
jar 包和 war 包都是⼀种压缩文件
jar 包就是把开发人员已经写好的一些代码进行打包,打好的 jar 包就可以引入到其他项目中,也可以直接使用这些 jar 包中的类和属性。另外也可以打成可执行 jar 包,这样的包就可以通过 java- jar 命令来执行 war 包可以理解为是一个 web 项目,里面是项目的所有东西,通常用于网站
1.5 依赖管理
上面说到 Maven 是一个项目管理工具,通过 pom.xml 文件的配置获取 jar 包,而不用手动去添加 jar 包,获取到的 jar 包,其实就是依赖
pom.xml 就是 Maven 的配置文件,用以描述项目的各种信息
1.5.1 依赖配置
依赖:指当前项目运行所需要的 jar 包。比如前面学习 JDBC 时,我们需要手动下载 mysql-connector-java 的包,并且添加到项目中。 如果使用 Maven,我们只需在 pom.xml 中引入 mysql-connector-java 的依赖就可以了。
<dependencies>
<!-- ⾥⾯放置项⽬的依赖坐标, 可为多个 -->
</dependencies>
1. 在 pom 文件 <dependencies> 标签内,添加依赖坐标
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
</dependencies>
2. 点击刷新按钮,引入新加入的依赖 jar 包
后续有添加新的 jar 包,或者修改 jar 包版本,都需要通过该方式在项目中添加依赖
3. 刷新之后,就可以在项目中看到新加入的 jar 包,如上图
1.5.2 依赖传递
早期我们没有使用 maven 时,向项目中添加依赖的 jar 包,需要把所有的 jar 包都复制到项目工程下。
比如 A 依赖 B,B 依赖 C,那么 A 项目引入 B 的同时,也需要引入 C,如果我们手动管理这个依赖,这个过程就会比较麻烦,我们需要知道每个库都依赖哪些库,以及这些依赖之间的版本是如何关联的。
比如我们要吃火锅,需要有锅,有调料,有食材,以及确认什么样的锅,什么样的食材。
比如去医院看病,需要带上以往的病历,检查结果,处方等,并且要确认带的资料是正确的,如果日期错了,或者患者错了,带少了,就需要回去重新拿。
但使用 maven 的话,就可以避免管理所需依赖的关系。我们只需要在 pom 文件中,定义直接依赖就可以了,由于 maven 的依赖具有传递性,所以会自动把所依赖的其他 jar 包也一起导入。
比如吃火锅,现在我们可以点一个海底捞外卖,直接就把所有食材都送过来了,包括什么锅,配什么菜。
比如去医院看病,借助 “互联网”,实现了信息共享,只需要带上身份证,以往的病历和检查结果就都可以看到了。
如上图,项目 A 通过 Maven 引入 JarA 时,会自动引入 JarB 和 JarC。
Jar A 和项目 B 就是项目 A 的直接依赖。
Jar B,Jar C 是间接依赖。
直接依赖:在当前项目中通过依赖配置建立的依赖关系。
间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源。
上面的依赖配置中
1.5.3 依赖排除
当前阶段我们需要依赖的库并不多,但随着项目的越来越复杂,库之间的依赖关系也会变得越来越复杂。如上图中,如果项目 A 不需要 JarB,也可以通过排除依赖的方式来实现。
排除依赖:
指主动断开依赖的资源。(被排除的资源无需指定版本)
比如,我下了一个快递单子,默认会有一个服务,就是快递小哥会上门取件,但是我刚好要出门,而且顺路经过站点,也可以选择自己送过去。
上面例子 mysql 中,排除 goole 的代码:
更方便的方法是利用插件来进行依赖排除
maven 还有一些功能是依赖调解、可选依赖等。
依赖调解:当项目中的依赖存在依赖冲突时,例如存在这样的依赖:
A->B->C->X(1.0)
A->D->X(2.0)
Maven 会采用最短路径优先的原则去选择依赖,这里 2 的依赖路径更短,所以会选择X(2.0),当然我们也可以选择指定某个依赖的版本。
当然也可以指定X的版本。
1.5.4 Maven Help 插件
当项目比较复杂时,我们就会有 Jar 包冲突的问题,这时候就需要去解决依赖冲突,解决冲突之前,需要先找到冲突,我们可以使用 Maven Helper 插件来观察包和包之间的依赖关系
理解"插件"(plugin)
天火+擎天柱=>会飞的擎天柱。
天火在牺牲之前把自己变成了擎天柱的“飞行插件”。在擎天柱需要起飞的时候就变成翅膀装在擎天柱身上。不需要起飞的时候就卸下来放到擎天柱的集装箱里。
程序开发的时候也经常如此。
像 IDEA 这样的程序虽然功能强大,但是也无法面面俱到。对于一些特殊场景的功能,开发者就可以开发一些“插件”。如果需要这个插件,就单独安装。
插件就是对程序的一些特定场景,做出一些特定的功能的扩展。
安装插件:File -> Settings -> Plugins -> 搜索 "Maven Helper" -> 找到对应插件,点击 Install 安装即可,安装后需重启 idea 生效
如果像上图一样搜索不出来,下载不了,请移步这位大佬的解决方案:idea 插件下载不了
安装之后,打开 pom 文件,可以看到 Jar 包之间的依赖关系:
也可以右键排除掉一些依赖
1.6 Maven 仓库
通过短短几行代码就可以把依赖 jar 包放到项目里,主要就是依靠以下代码
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
这个代码,我们称之为 “坐标”,是唯一的
在 Maven 中,根据 groupld、artifactld、version 的配置,来唯一识别一个 jar 包,缺一不可
当我们在 pom 文件中配置完依赖之后,点击刷新,Maven 会根据坐标的配置,去仓库里寻找 jar 包,并把他下载下来,添加到这个项目中,这个 Jar 包下载的地方就称为仓库
仓库:用于存储资源,管理各种 Jar 包
Maven 仓库的本质就是一个目录(文件夹),这个目录被用来存储开发中所有依赖(Jar 包、插件等)
Maven 仓库分为两大类:本地仓库和远程仓库,其中远程仓库又分为中央仓库,私服和其他公共库
1.6.1 中央仓库
中央仓库:Maven 软件中内置一个远程仓库地址,就是中央仓库,服务于整个互联网,由 Maven 团队维护,全球唯一
仓库地址:https://repo1.maven.org/maven2/
可以通过 Maven Repository: Search/Browse/Explore (mvnrepository.com) 这个网站来查询并下载
查找 Jar 的坐标:
1. 访问 Maven Repository: Search/Browse/Explore (mvnrepository.com)
2. 进行查找,如 mysql
3. 选择要添加的 Jar 包版本
4. 查看 Jar 包对应坐标
1.6.2 本地仓库
自己计算机上的一个目录(用来存储 Jar 包)
当项目中引入对应依赖 Jar 包后,首先会查找本地仓库中是否有对应的 Jar 包
- 如果有,则在项目中直接引用
- 如果没有,则去中央仓库中下载对应的 Jar 包到本地仓库
本地仓库地址可以通过 Maven 配置查看
File -> Settings
查看该仓库目录,可以看到该目录下很多 Jar(最开始是空的,随着 Maven 的使用,该仓库下文件会越来越多)
1.6.3 私有服务器,也称为私服
一般由公司团队搭建的私有仓库
私服属于某个公司或某个部门,往往需要一定的权限
有了私服之后,Maven 依赖下载的顺序又发生了改变,当 Maven 需要下载资源时:
1. 先从本地仓库获取,本地仓库存在,则直接返回
2. 如果本地仓库没有,就从私服请求,私服存在该资源,就直接返回
3. 如果私服上不存在该资源,则从中央仓库下载,中央仓库不存在就报错
4. 如果中央仓库存在,就先缓存到私服上,然后再缓存到本地仓库里,再为 Maven 的下载请求提供服务(私服是很多人在使用的,所以只需要第一个使用者下载一次就可以了)