学习这一部分要先检查IDEA版本,社区办要求 2021.1~2022.1.4,专业版则无要求。如果个人电脑不是专业版,版本又不在这个范围,需要卸载重新安装。
IDEA卸载参考:IDEA卸载和删除注册表_idea清理注册表-CSDN博客(一定要删除注册表)
一、什么是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.
翻译过来就是:
Maven是一个项目管理工具。基于 POM (Project Object Model,项目对象模型)的概念,Maven 可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
大白话:
Maven是一个项目管理工具,通过 pom.xml文件的配置获取jar包,而不用手动去添加 jar包。
二、为什么要学Maven
一句话:简单、方便,能提高我们的开发效率,减少我们的开发BUG。
Maven提供的功能非常多,下面的体现主要是以下两个方面:1、项目构建 2、管理依赖。
三、创建一个Maven项目
IDEA本身已经集成了Maven,不需要我们另外单独安装,可以在IDEA上直接用,不用安装。
下面是用专业版2023.2演示:打开IDEA -> file -> New Project,如图:
点击create,就创建好了一个Maven项目,还会自动生成一个pom.xml文件,如图:
四、Maven 核心功能
接下来,我们结合项目,介绍 Maven 在项目开发中的作用。主要体现在:1、项目构建 2、管理依赖。
1、项目构建
Maven 提供了标准的、跨平台(Linux,Windows,MacOS等)的自动化项目构建方式。
当我们开发一个项目之后,代码需要经过编译、测试、打包、发布等流程,每次代码的修改,都需要经过这些流程,如果代码反复调试修改,这个流程就需要反复进行,就显得非常麻烦,而 Maven 给我们提供了一套简单的命令来完成项目的构建。
下面写一些简单的Java代码:
public class Test { public static void main(String[] args) { for (int i = 1; i <= 5; i++) { System.out.println("hello world"); } } }
如图:
左键双击package,就可以把我们刚才写的代码,打成 jar 包,如图:
打包就是把所有的 class 文件,全部都放在一起,打成 jar包 或者 war包
jar包 和 war包 都是一种压缩文件。
jar包 就是把开发人员已经写好的一些代码进行打包。打好的 jar包 就可以引入到其他项目中,也可以直接使用这些 jar包 中的类和属性。另外也可以打成可执行的 jar包,这样的包就可以通过 java -jar 命令来执行。
war包 可以理解为是一个web项目,里面是项目的所有东西,通常用于网站。
2、依赖管理
上面说到,Maven 是一个项目管理工具,通过 pom.xml 文件的配置获取 jar包,而不用手动去添加 jar包。获取的 jar包,其实就是依赖。
(1)依赖配置
依赖:指当前项目运行所需要的 jar包。
比如之前学习 JDBC 时,我们需要手动下载 mysql-connector-java 的包,并且要手动添加到项目中。而使用Maven,只需要在 pom.xml 中引入 mysql-connector-java 的依赖就好了。
格式:
<dependencies> <!--⾥⾯放置项⽬的依赖坐标, 可为多个 --> </dependencies>
<dependencies>标签是.xml文件的,格式有点像html的标签;依赖可以理解为就是经纬度,给你经纬度,你就可以在找到相应的目标位置。
1、在pom.xml文件内写入下面代码:
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.30</version> </dependency> </dependencies>
2、点击刷新按钮,引入新加入的依赖 jar包。(后续有添加新的 jar包,或者修改 jar包 版本,都需要通过上述方式在项目中添加依赖)
刷新按钮的点击,有下面两种方式:
3、刷新完成后,在左边这里的目录下就有对应的jar包了,如图:
(2)依赖传递
早期没有使用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是间接依赖。
直接依赖:在当前项目中 通过依赖配置建立的依赖关系。
间接依赖:被依赖的资源 如果依赖其他资源,当前项目间接依赖其他资源。
(3)依赖排除
排除依赖:指主动断开依赖的资源。(被排除的资源无需指定版本)
当前阶段我们需要依赖的库并不多,但随着项目的越来越来复杂,库之间的依赖关系也会变得越来越复杂。像上面图中,如果项目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还有一些功能,是依赖调解,可选依赖等。
当项目中的依赖存在依赖冲突,例如存在这样的依赖:
A->B->C->X(1.0)
A->D->X(2.0)
Maven会采用最短路径优先的原则去选择依赖,这里2的依赖路径更短,所以会选择X(2.0),当然也可以指定某个依赖的般般,指定X(1.0)。
3、Maven Help 插件
安装插件过程:File -> Setting -> Plugins -> 搜索 “Maven Help” -> 找到对应插件,点击 Install 安装即可,按照后要重启 IDEA,才能生效。如下图:
点击 Install 后,下载完后就如下图:
点击 Restart IDE,重启IDEA。
安装完后,打开 pom.xml 文件,就可以看到 Jar包 之间的依赖关系,如图:
也可以右键排除掉一些依赖,如图:
点击后,就会没了,如图:
五、Maven 仓库
(1)仓库的介绍
我们通过短短几行代码,就可以把依赖 jar包 放在项目里,具体是如何做的呢?
<dependencies> <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency> </dependencies>
这个代码,我们称之为 “坐标”,也就是唯一的。
在Maven中,根据 groupId、artifactId、version 来配置,通过这些标签,识别出唯一的一个jar包,这三个标签,缺一不可。
当我们在 pom 文件中配置完依赖之后,点击刷新,Maven 就会根据坐标的配置,去仓库里寻找 jar包,并把他下载下来,添加到项目中。这个 jar包 下载的地方,就称为仓库。
仓库:用于存储资源,管理各种 jar包。如图:
Maven仓库 的本质就是一个目录(文件夹),这个目录被用来存储开发中所有依赖(jar包、插件等)。
如图:
Maven仓库 分为两大类:本地仓库 和 远程仓库。其中远程仓库又分为中央仓库、私服 和 其他公共库。
(2)本地仓库
本地仓库:自己计算机上的一个目录(用来存储 jar包)。
当项目中引入对应依赖 jar包 后,首先会查找本地仓库中是否有对应的 jar包。
——如果有,则在项目中直接引用。
——如果没有,则去中央仓库中下载对应的 jar包 到本地仓库。
如图:
本地仓库地址可以通过 Maven 配置查看:File -> Settings,如图:
User settings file:Maven的配置文件。
Local repository:Maven的本地仓库地址。
如果这里默认的目录上有中文路径,则要修改一下路径,或者想把本地仓库地址路径换一下,可以进行修改,下面是修改方法:
找到原来地址仓库的 .m文件,全部复制下来
把它粘贴到你的目的路径,如图:
现在修改IDEA的仓库地址目录和Maven的配置文件(在settings上),如图:
还要修改新的项目的仓库地址和配置文件,位置在如图:
步骤和上面的一样,如图:
经过上面这些步骤,就可以修改本地仓库路径了(这里我把国内源也换了一下,下面会有介绍)。我们查看本地仓库目录,可以看到该目录下有许多 .jar 文件。(最开始是空的,随着Maven的使用,该仓库下文件会越来越多)
(3)中央仓库
中央仓库:Maven 软件中内置一个远程仓库地址,也就是中央仓库的地址,服务于整个互联网。由 Maven 团队维护,这是全球唯一的。我们也可以把自己写好的 Jar包 上传到中央仓库(需具备一定的要求),也可以从中央仓库下载 Jar包。
仓库地址:https://repo1.maven.org/maven2/
查询Jar包在仓库的坐标(位置):https://mvnrepository.com/
如何查找 Jar 的坐标?
1、访问 https://mvnrepository.com/ 。
2、进行查找,比如要找的是 MySQL。
3、选择要添加的 jar包 版本
4、查看 jar包 对应的坐标
框出来的文本就是jar包对应的坐标,复制框出来的文本,粘贴进 IDEA 的 pom.xml 文件中。
(4)私有服务器
私有服务器,简称为:私服,一般由公司团队搭建的私有仓库。私服属于某个公司,或者某个部门,往往需要一定权限;
当有了私服之后,Maven依赖下载顺序就会发生变化,如图:
当 pom.xml 写入一个依赖时,是先到本地仓库查找
1、如果本地仓库有,就直接从本地仓库拿。
2、如果本地仓库没有,就到私服中查找,私服中有,就从私服上下载这个依赖到本地仓库中。
3、如果私服没有,就会在中央仓库上查找,中央仓库有,私服就会从中央仓库中下载下来,然后再传给本地仓库。
4、如果中央仓库没有,也会从中央仓库下载,但中央仓库没有这个资源,就会报异常。
因为私服是很多人在使用的,所以只需要第一个使用者下载一次,就可以了。
六、Maven 设置国内源
和上面设置本地仓库目录操作一样
1、配置当前项目的setting:
file -> Settings
原始的Maven路径,不同电脑路径不同,可以在这上面看到的,选择新的路径不能有中文,操作和上面介绍修改本地仓库路径一样。
配置国内源
Maven仓库默认在国外:https://repo1.maven.org/maven2/ ,国内使用时会比较慢,我们可以更换为阿里云的仓库,也可以是别的仓库,参考:Maven 镜像地址大全 - 知乎 (zhihu.com)
打开setting.xml,在 mirrors节点上,添加内容如下:
<mirror> <id>aliyunmaven</id> <mirrorOf>central</mirrorOf> <name>阿⾥云公共仓库</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror>
如果上述地址不存在settings文件,则可以用这个:setting.xml (泡泡姐的gitee仓库)
2、设置新项目的setting:
file -> New Projects Setup -> Settings for New Projects
点击完这里后,操作跟上面的操作一样