从零开始学 Maven:Java 项目构建与依赖管理详解
Maven 是一款基于 POM 的项目管理与构建工具。 Maven 的环境准备、核心概念及功能,包括项目构建、依赖管理(传递性与排除)、仓库机制(本地、中央、私服)及国内源配置。通过 Maven 可自动化编译、测试、打包流程,简化依赖引入,提升开发效率。

Maven 是一款基于 POM 的项目管理与构建工具。 Maven 的环境准备、核心概念及功能,包括项目构建、依赖管理(传递性与排除)、仓库机制(本地、中央、私服)及国内源配置。通过 Maven 可自动化编译、测试、打包流程,简化依赖引入,提升开发效率。

IDEA 版本:
社区版:2021.1 - 2022.1.4
专业版:无要求
官方对于 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 既然是一个软件,但是我们为什么下载 IDEA 后没有主动下载呢?
答:IntelliJ IDEA 自带了 Maven 插件,安装 IDEA 时,它会默认安装并启用该插件。Maven 安装在:Idea 路径/plugins/下,Idea 路径/plugins/中的 maven 文件就是。该插件并不包含完整的 Maven 软件,而是提供了 Maven 集成环境,允许用户在 IDEA 中使用 Maven 功能来构建和管理项目。
Maven 可以自动化项目的构建过程,包括编译源代码、运行测试、打包、生成文档等。它通过配置文件 pom.xml 来定义构建流程,并可以让你在不同的环境中一致地执行这些步骤,避免了手动构建的繁琐和易出错。
一句话: 简单,方便,提高我们的开发效率,减少我们的开发 Bug。
IDEA 本身已经集成了 Maven,我们可以直接使用,无需安装
以下截图的 IDEA 版本为:2024.1.2,不同版本的 IDEA 界面展示会有所不同

然后点击 Create,第一次创建需要等待的时间比较长。
创建好的项目结构:

Maven 提供了标准的、跨平台(Linux, Windows, MacOS 等)的自动化项目构建方式。当我们开发了一个项目之后,代码需要经过编译、测试、打包、发布等流程,每次代码的修改,都需要经过这些流程,如果代码反复调试修改,这个流程就需要反复进行,就显得特别麻烦,而 Maven 给我们提供了一套简单的命令来完成项目的构建。
点击项目结构的 pom.xml,然后点击右侧的 M:

框住的是 Maven 命令,Maven 是一个工具,和 IDEA 没有关系,IDEA 只是把 maven 集成了。也可以在不使用 IDEA 的情况下不使用 Maven,这时需要使用 Maven 命令。
比如,点击 package,就可以完成项目的打包操作

运行后的结果:

打包就是把所有的 class 文件,全部放在一起,打成 jar 包或者 war 包,jar 包和 war 包都是一种压缩文件。 jar 包就是把开发人员已经写好的一些代码进行打包。打好的 jar 包就可以引入到其他项目中,也可以直接使用这些 jar 包中的类和属性。另外也可以打成可执行 jar 包,这样的包就可以通过 java -jar 命令来执行。 war 包可以理解为一个 web 项目,里面是项目的所有东西,通常用于网站。
怎么理解依赖呢? 答:依赖就是第三方的 jar 包,第三方的框架,等等,使用第三的依赖后就不用我们自己创建; 比如:我们想吃大米,我们不用自己种大米,用市场上卖的大米来做米饭。
之前 JDK 中没有 Maven,需要提前下载好 jar 包,然后添加到项目结构中。 上面说到,Maven 是一个项目管理工具,通过 pom.xml 文件的配置获取 jar 包,而不用手动去添加 jar 包获取的 jar 包,其实就是依赖。
pom.xml 文件就是 maven 的配置文件,用以描述项目的各种信息进行依赖配置。
依赖:指当前项目运行所需要的 jar 包。 比如前面学习 JDBC 时,我们需要手动下载 mysql-connector-java 的包,并且添加到项目中。
如果使用 Maven,我们只需要在 pom.xml 中引入 mysql-connector-java 的依赖就可以了
<dependencies><!--里面放置项目的依赖坐标,可为多个 --></dependencies>
比如:在 pom 文件标签内,添加使用 MySQL 所需要的配置文件
点击刷新按钮,引入新加入的依赖 jar 包

在 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 是间接依赖。 直接依赖:在当前项目中通过依赖配置建立的依赖关系。
我们也可以下载插件 MavenHelp 来查看依赖的关系

间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源。 比如:MySQL 依赖 protobuf,当引入 mysql 的同时也自动引入了 protobuf。 下载成功后按下面的步骤


当前阶段我们需要依赖的库并不多,但随着项目的越来越复杂,库之间的依赖关系也会变得越来越复杂。如上图中,如果项目 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 的版本。
我们通过短短几行代码,就把依赖 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 包,插件等).

Maven 仓库分为两大类:本地仓库和远程仓库。其中远程仓库又分为中央仓库,私服 和其他公共库
如果没有 maven,需要先自己找 jar 包下载到本地,然后把 jar 包放到项目中。有了 maven 后,只需要描述,maven 根据描述从中央仓库下载合适 jar 包到本地仓库,然后把 jar 包放在项目中。
本地仓库:自己计算机上的一个目录 (用来存储 jar 包)。 ==当项目中引入对应依赖 jar 包后,首先会查找本地仓库中是否有对应的 jar 包 ==

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

查看该仓库目录,可以看到该目录下有很多的 jar(最开始是空的,随着 Maven 的使用,该仓库下文件会越来越多)。
中央仓库:maven 软件中内置一个远程仓库地址,就是中央仓库,服务于整个互联网。由 Maven 团队维护,全球唯一。
仓库地址:https://repo1.maven.org/maven2/ 可以通过 https://mvnrepository.com 这个网站来查询并下载。
我们可以把自己写好的 Jar 包上传到中央仓库 (具备一定的要求),也可以从中央仓库下载 Jar 包。查找 Jar 的坐标:

选择要添加的 Jar 包版本

进行查找,比如 mysql

私服:一般由公司团队搭建的私有仓库。 私服属于某个公司,或者某个部门,往往需要一定权限。有了私服之后,Maven 依赖下载的顺序又发生了变化。

当 Maven 需要下载资源的时候:
私服是很多人使用的,所以只需要第一个使用者下载一次就可以了。
我们第一次创建 Maven 项目需要等待很长时间,其实就是使用的是远程仓库的原因(中央仓库在国外,jar 包下载速度慢),我们也可以使用国内的远程仓库,比如阿里云的。
默认远程仓库和本地仓库通常在 C 盘,建议修改至其他盘符以节省空间。
改 repository 配置,然后再次查看 maven 仓库:File -> Settings


进入修改 settings.xml 文件的目录

把刚才粘贴的文件配置上

先改中央仓库为阿里云仓库

用 IDEA 打开 settings.xml 文件

换成如下代码,保存
<mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url></mirror>
然后把刚才改的文件配置上

上述的国内 maven 源更改成功后也可以在创建 Maven 项目时选择国内源。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online