Maven
Maven 介绍
Maven 是 Apache 旗下的一个开源项目, 是一款用于管理和构建 Java 项目的工具.

Apache 软件基金会, 成立于 1999 年 7 月, 是目前世界上最大的最受欢迎的开源软件基金会, 也是一个专门为支持开源项目而生的非盈利性组织.
开源项目: https://www.apache.org/index.html#projects-list
Maven 官网:http://Maven.apache.org/
Apache Maven 是一个项目管理和构建工具, 它基于项目对象模型 (POM) 的概念, 通过一小段描述信息来管理项目的构建、报告和文档.
POM: project object model
Maven 的作用

管理依赖
传统方式中, 需要用到哪个三方工具, 就找到这个工具的 jar 包, 然后手动导入这个 jar 包, 但是如果通过手动导入 jar 包的方式来开发一个大型项目, 将会非常繁琐, 因为可能会用到很多个 jar 包, 非常不利于管理.

当使用 Maven 进行项目依赖 (jar 包) 管理时, 则很方便的可以解决这个问题. 我们只需要在 Maven 项目的 pom.xml
文件中, 添加一段如下图所示的配置即可实现.

统一项目结构
Maven 可以提供标准、统一的项目结构.
在项目开发中, 当你使用不同的开发工具 (如: Eclipse、Idea) 创建项目工程时:

若我们创建的是一个 Maven 工程, 则可以帮我们自动生成统一、标准的项目目录结构:

具体的统一结构如下:

目录说明:
- src/main/java: Java 源代码目录
- src/main/resources: 配置文件信息
- src/test/java: 测试代码
- src/test/resources: 测试配置文件信息
构建项目
Maven 提供了标准的、跨平台 (Linux、Windows、MacOS) 的自动化项目构建方式.

如上图所示, 当我们开发了一套系统, 代码需要进行编译、测试、打包、发布, 这些操作如果需要反复进行就显得特别麻烦, 而 Maven 提供了一套简单的命令来完成项目构建.


Maven 的组成
Maven 由三个部分组成:
-
项目对象模型 (Project Object Model)
-
依赖管理模型 (Dependency)
-
构建生命周期/阶段 (Build lifecycle & phases)
构建生命周期/阶段 (Build lifecycle & phases)

上图中紫色框起来的部分, 就是用来完成标准化构建流程, 是构建一个项目的生命周期, 或者说是各个阶段.
当我们需要编译, Maven 提供了一个编译插件供我们使用; 当我们需要打包, Maven 就提供了一个打包插件供我们使用等.
通过 Maven 提供的各种插件, 就可以完成对应的功能. 比如通过编译插件就可以对项目进行编译, 通过测试插件进行项目的测试. 通过打包插件进行项目的打包. 通过这些插件, 就可以完成项目的标准化构建.
执行这些构建操作的时候, 不同的阶段会有不同的文件产生. 比如编译阶段就会有编译之后的字节码文件产生, 打包阶段就会有打包之后的 jar 文件产生. 这些产物都在 targets 目录下的不同子目录内.

这就是 Maven 的第一部分, 通过提供的各种插件, 来完成项目的标准化构建.
项目对象模型 (POM)

项目对象模型是指在 Maven 当中可以通过 pom.xml
当中配置的一小段信息来描述这个 Maven 工程. 这一小段信息就是这个 Maven 工程的坐标.
以上图中紫色框起来的部分属于项目对象模型, 就是将我们自己的项目抽象成一个对象模型, 有自己专属的坐标, 如下图所示是一个 Maven 项目:

7, 8, 9 这三行就是用来描述这个 Maven 工程的.
第 7 行描述当前这个 Maven 工程归属的组织.
第 8 行描述当前 Maven 工程的模块名称.
第 9 行描述这个 Maven 工程的版本.
这三项信息称为 Maven 的坐标.
通过这个坐标就能唯一地标识以及定位这个项目.
依赖管理模型

以上图中紫色框起来的部分属于依赖管理模型, 是使用坐标来描述当前项目依赖哪些第三方 jar 包.
如果在一个 Maven 工程当中还需要依赖其他的资源, 就可以在 pom.xml
当中添加依赖管理模型.
比如这个工程需要用到 logback 的依赖, 那么在 pom.xml
中就可以用 dependencies 内的 dependency 这个标签来指定这个依赖的坐标.
坐标, 就是资源 (jar 包) 的唯一标识, 通过坐标可以定位到所需资源 (jar 包) 位置.
添加了这个依赖的坐标之后, Maven 就自动地从仓库当中查找这个依赖.
jar 包在仓库中的存储是有结构的. 目录是: ch 下的 qos 下的 logback 目录, 找名为 logback-classic 目录, 找版本为 1.2.11.
仓库目录:




上方展示的是本地仓库.
本地仓库在安装 Maven 的时候是可以自己指定的.
Maven 仓库
仓库: 用于存储资源, 管理各种 jar 包.
仓库的本质就是一个目录 (文件夹), 这个目录被用来存储开发中所有依赖 (就是 jar 包) 和插件.

Maven 仓库分为:
-
本地仓库: 自己计算机上的一个目录 (用来存储 jar 包)
-
中央仓库: 由 Maven 团队维护的全球唯一的. 仓库地址: https://repo1.Maven.org/Maven2/
-
远程仓库 (私服): 一般由公司团队搭建的私有仓库
当项目中使用坐标引入对应依赖 jar 包后, 首先会查找本地仓库中是否有对应的jar包
-
如果有, 则在项目直接引用
-
如果没有, 则去中央仓库中下载对应的 jar 包到本地仓库
如果还可以搭建远程仓库 (私服), 将来 jar 包的查找顺序则变为: 本地仓库 --> 远程仓库 --> 中央仓库
从中央仓库下载内容, 速度较慢, 可以用远程仓库加快下载速度.
Maven 安装
下载
下载地址: https://Maven.apache.org/download.cgi
安装步骤
Maven 安装配置步骤:
-
解压安装
-
配置仓库
-
配置 Maven 环境变量
解压 apache-Maven-3.6.1-bin.zip (解压即安装). 建议解压到没有中文、特殊字符的路径下. 如解压到 E:\develop
下.
解压缩后的目录结构如下:
-
bin目录 : 存放的是可执行命令. (mvn 命令重点关注)
-
conf目录 : 存放Maven的配置文件. (settings.xml配置文件后期需要修改)
-
lib目录 : 存放Maven依赖的jar包. (Maven也是使用java开发的, 所以它也依赖其他的jar包)
安装包:
mvn 这条指令表示运行.
配置本地仓库就是指定一个目录, 让这个目录作为Maven的本地仓库来存储我们下载下来的一些资源.
但是这行代码是注释着的, 需要复制出来.
为了方便管理, 就在Maven解压目录下, 新建一个文件夹, 作为本地仓库.
把这个目录放到 settings.xml 文件中:
阿里云私服地址:
<mirror>
<id>aliMaven</id>
<name>aliyun Maven</name>
<url>http://Maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
原来的文件的样子:
Maven依赖jdk. 视频jdk是11版本的.
配置完成:
IDEA 集成 Maven
配置Maven环境
当前工程设置
1、选择 IDEA中 File => Settings => Build,Execution,Deployment => Build Tools => Maven
2、设置IDEA使用本地安装的Maven, 并修改配置文件及本地仓库路径
Maven home path : 指定当前Maven的安装目录
User settings file : 指定当前Maven的settings.xml配置文件的存放路径
Local repository : 指定Maven的本地仓库的路径 (如果指定了settings.xml, 这个目录会自动读取出来, 可以不用手动指定)
实操:
上述配置的Maven环境, 只是针对于当前工程的, 如果我们再创建一个project, 又恢复成默认的配置了. 要解决这个问题, 我们就需要配置全局的Maven环境.
全局设置
1、进入到IDEA欢迎页面
- 选择 IDEA中 File => close project
创建Maven项目
在上面创建出来的那个空的project里创建一个模块.
只有这个:
创建工程时也只有这个选项:
创建成功的样子:
Maven坐标详解
什么是坐标?
-
Maven中的坐标是资源的唯一标识 , 通过该坐标可以唯一定位资源位置
-
使用坐标来定义项目或引入项目中需要的依赖
Maven坐标主要组成
-
groupId: 定义当前Maven项目隶属组织名称(通常是域名反写, 例如: com.itheima)
-
artifactId: 定义当前Maven项目名称(通常是模块名称, 例如 order-service、goods-service)
-
version: 定义当前项目版本号
如下图就是使用坐标表示一个项目:
注意:
上面所说的资源可以是插件、依赖、当前项目.
我们的项目如果被其他的项目依赖时, 也是需要坐标来引入的.
导入Maven项目
方式1: 使用Maven面板, 快速导入项目
先将希望被导入的Maven模块复制到存放这个模块的项目的文件夹下.
打开IDEA, 选择右侧Maven面板, 点击 + 号, 选中对应项目的pom.xml文件, 双击即可
如果没有Maven面板, 选择 View => Appearance => Tool Window Bars
方式2: 使用idea导入模块项目
File => Project Structure => Modules => + => Import Module
删除Maven模块
依赖管理
依赖配置
依赖: 指当前项目运行所需要的jar包. 一个项目中可以引入多个依赖.
例如: 在当前工程中, 我们需要用到logback来记录日志, 此时就可以在Maven工程的pom.xml文件中, 引入logback的依赖. 具体步骤如下:
-
在pom.xml中编写
<dependencies>
标签 -
在
<dependencies>
标签中使用<dependency>
引入坐标 -
定义坐标的 groupId、artifactId、version
<dependencies>
<!-- 第1个依赖 : logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<!-- 第2个依赖 : junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
点击刷新按钮, 引入最新加入的坐标
- 刷新依赖: 保证每一次引入新的依赖, 或者修改现有的依赖配置, 都可以加入最新的坐标
注意事项:
-
如果引入的依赖, 在本地仓库中不存在, 将会连接远程仓库 / 中央仓库, 然后下载依赖(这个过程会比较耗时, 耐心等待)
-
如果不知道依赖的坐标信息, 可以到mvn的中央仓库(https://mvnrepository.com/)中搜索
**添加依赖的几种方式: **
-
利用中央仓库搜索的依赖坐标
-
利用IDEA工具搜索依赖
-
熟练上手Maven后, 快速导入依赖
依赖传递
依赖具有传递性
早期我们没有使用Maven时, 向项目中添加依赖的jar包, 需要把所有的jar包都复制到项目工程下. 如下图所示, 需要logback-classic时, 由于logback-classic又依赖了logback-core和slf4j, 所以必须把这3个jar包全部复制到项目工程下.
我们现在使用了Maven, 当项目中需要使用logback-classic时, 只需要在pom.xml配置文件中, 添加logback-classic的依赖坐标即可.
在pom.xml文件中只添加了logback-classic依赖, 但由于Maven的依赖具有传递性, 所以会自动把所依赖的其他jar包也一起导入.
依赖传递可以分为:
-
直接依赖: 在当前项目中通过依赖配置建立的依赖关系
-
间接依赖: 被依赖的资源如果依赖其他资源, 当前项目间接依赖其他资源
比如以上图中:
-
projectA依赖了projectB. 对于projectA 来说, projectB 就是直接依赖.
-
而projectB依赖了projectC及其他jar包. 那么此时, 在projectA中也会将projectC的依赖传递下来. 对于projectA 来说, projectC就是间接依赖.
问题: 之前我们讲了依赖具有传递性. 那么A依赖B, B依赖C, 如果A不想将C依赖进来, 是否可以做到?
答案: 在Maven项目中, 我们可以通过排除依赖来实现.
排除依赖
什么是排除依赖?
- 排除依赖: 指主动断开依赖的资源. (被排除的资源无需指定版本)
<dependency>
<groupId>com.itheima</groupId>
<artifactId>Maven-projectB</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依赖, 主动断开依赖的资源-->
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖排除示例:
- Maven-projectA依赖了Maven-projectB, Maven-projectB依赖了Junit. 基于依赖的传递性, 所以Maven-projectA也依赖了Junit
使用排除依赖后
依赖范围
在项目中导入依赖的jar包后, 默认情况下, 可以在任何地方使用.
如果希望限制依赖的使用范围, 可以通过<scope>
标签设置其作用范围.
作用范围:
-
主程序范围有效(main文件夹范围内)
-
测试程序范围有效(test文件夹范围内)
-
是否参与打包运行(package指令范围内)
如上图所示, 给junit依赖通过scope标签指定依赖的作用范围. 那么这个依赖就只能作用在测试环境, 其他环境下不能使用.
scope标签的取值范围:
scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc驱动 |
生命周期
介绍
Maven的生命周期就是为了对所有的构建过程进行抽象和统一. 描述了一次项目构建, 经历哪些阶段.
在Maven出现之前, 项目构建的生命周期就已经存在, 软件开发人员每天都在对项目进行清理, 编译, 测试及部署. 虽然大家都在不停地做构建工作, 但公司和公司间、项目和项目间, 往往使用不同的方式做类似的工作.
Maven从大量项目和构建工具中学习和反思, 然后总结了一套高度完美的, 易扩展的项目构建生命周期. 这个生命周期包含了项目的清理, 初始化, 编译, 测试, 打包, 集成测试, 验证, 部署和站点生成等几乎所有构建步骤.
Maven对项目构建的生命周期划分为3套(相互独立):
-
clean: 清理工作. 清理上一次项目构建所产生的一些文件, 比如编译后产生的class字节码文件, 打包之后的jar包文件.
-
default: 核心工作. 如: 编译、测试、打包、安装、部署等.
-
site: 生成报告、发布站点等.
三套生命周期又包含哪些具体的阶段呢, 我们来看下面这幅图:
我们看到这三套生命周期, 里面有很多很多的阶段, 这么多生命周期阶段, 其实我们常用的并不多, 主要关注以下几个:
• clean: 移除上一次构建生成的文件
• compile: 编译项目源代码
• test: 使用合适的单元测试框架运行测试(junit)
• package: 将编译后的文件打包, 如: jar、war等
• install: 安装项目到本地仓库
在同一套生命周期中, 阶段是有先后顺序的, 先运行前面的阶段, 再运行后面的阶段. 后面的阶段是需要依赖于前面的阶段的. 在一套生命周期中, 如果运行后面的生命周期进行项目构建, 那么前面的阶段也会运行. 比如运行 package 阶段, 那么 compile 阶段也会运行.
Maven 的生命周期是抽象的, 这意味着生命周期本身不做任何实际工作. 在 Maven 的设计中, 实际任务(如源代码编译)都交由插件来完成.
IDEA工具为了方便程序员使用Maven生命周期, 在右侧的Maven工具栏中, 已给出快速访问通道.
生命周期的顺序是: clean --> validate --> compile --> test --> package --> verify --> install --> site --> deploy
我们需要关注的就是: clean --> compile --> test --> package --> install
说明: 在同一套生命周期中, 我们在执行后面的生命周期时, 前面的生命周期都会执行.
思考: 当运行package生命周期时, clean、compile生命周期会不会运行?
clean不会运行, compile会运行. 因为compile与package属于同一套生命周期, 而clean与package不属于同一套生命周期.
执行
在日常开发中, 当我们要执行指定的生命周期时, 有两种执行方式:
-
在idea工具右侧的Maven工具栏中, 选择对应的生命周期, 双击执行
-
在DOS命令行中, 通过Maven命令执行
方式一: 在idea中执行生命周期
- 选择对应的生命周期, 双击执行
compile:
执行 compile 命令之前:
执行完 compile 命令之后, 多出来一个 target 目录:
24.cnblogs.com/blog/3429446/202411/3429446-20241118225623360-1772553014.png)
生成的 class 文件:
test:
package:
install:
clean:
方式二: 在命令行中执行生命周期
- 进入到DOS命令行
!
更新依赖索引
有时候给idea配置完Maven仓库信息后, 在idea中依然搜索不到仓库中的jar包. 这是因为仓库中的jar包索引尚未更新到idea中. 这个时候我们就需要更新idea中Maven的索引了, 具体做法如下:
打开设置----搜索Maven----Repositories----选中本地仓库-----点击Update
清理Maven仓库
初始情况下, 我们的本地仓库是没有任何jar包的, 此时会从私服去下载(如果没有配置, 就直接从中央仓库去下载), 可能由于网络的原因, jar包下载不完全, 这些不完整的jar包都是以lastUpdated结尾. 此时, Maven不会再重新帮你下载, 需要你删除这些以lastUpdated结尾的文件, 然后Maven才会再次自动下载这些jar包.
如果本地仓库中有很多这样的以lastUpadted结尾的文件, 可以定义一个批处理文件, 在其中编写如下脚本来删除:
set REPOSITORY_PATH=E:\develop\apache-Maven-3.6.1\mvn_repo
rem 正在搜索...
del /s /q %REPOSITORY_PATH%\*.lastUpdated
rem 搜索完毕
pause
操作步骤如下:
1). 定义批处理文件del_lastUpdated.bat (直接创建一个文本文件, 命名为del_lastUpdated, 后缀名直接改为bat即可 )
2). 在上面的bat文件上右键---》编辑 . 修改文件:
修改完毕后, 双击运行即可删除Maven仓库中的残留文件.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!