文章目录
1. Maven 简介
Maven 是 Apache 旗下的一个开源项目,它基于项目对象模型(Project Object Model , 简称: POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。是一款用于管理和构建 Java 项目的工具。
官网:Maven – Welcome to Apache Maven
Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织。
开源项目:Welcome to The Apache Software Foundation!
2. Maven 的作用
2.1 方便的依赖管理
- 方便的依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题。
若没有通过 Maven 进行大型项目的依赖管理,我们在开发项目时,需要引入大量的 jar 包,jar 包和 jar 包之间很多时候是需要版本匹配的,很容易出现版本冲突问题。当使用 Maven 进行项目依赖(jar包)管理,则可以很方便地解决这个问题。 我们只需要在 Maven 项目的 pom.xml 文件中,修改配置即可实现。
2.2 统一的项目结构
- 统一的项目结构:提供标准、统一的项目结构。
在项目开发中,当使用不同的开发工具 (如:Eclipse、IDEA),创建项目工程时,项目目录结构是不一样的,若我们创建的是一个 Maven 工程,可以帮我们自动生成统一、标准的项目目录结构:
2.3 标准的项目构建流程
- 标准的项目构建流程:标准跨平台(Linux、Windows、MacOS)的自动化项目构建方式。
我们开发了一套系统,代码需要进行编译、测试、打包、发布,这些操作如果需要反复进行就显得特别麻烦,而 Maven 提供了一套简单的命令来完成项目构建。
3. Maven 模型
Maven 由以下三个部分组成:
- 项目对象模型 (Project Object Model):将我们自己的项目抽象成一个对象模型,有自己专属的坐标。
坐标:就是资源(jar包)的唯一标识,通过坐标可以定位到所需资源(jar包)位置
- 依赖管理模型(Dependency):使用坐标来描述当前项目依赖哪些第三方jar包。
- 构建生命周期/阶段(Build lifecycle & phases):用来完成标准化构建流程 。当我们需要编译,Maven提供了一个编译插件供我们使用;当我们需要打包,Maven就提供了一个打包插件供我们使用等。
4. Maven 仓库
之前我们项目中需要 jar 包时,直接就把 jar 包复制到项目下的 lib 目录,而现在书写在 pom.xml 文件中的坐标又是怎么能找到所要的 jar 包文件的呢?
Maven 仓库:用于存储资源,管理各种 jar 包
仓库的本质就是一个目录(文件夹),这个目录被用来存储开发中所有依赖就是(jar 包)和插件
Maven仓库分为:
- 本地仓库:自己计算机上的一个目录(用来存储jar包)
- 中央仓库:由 Maven 团队维护的全球唯一的。仓库地址:Central Repository: (maven.org)
- 远程仓库(私服):一般由公司团队搭建的私有仓库
当项目中使用坐标引入对应依赖 jar 包后,首先会查找本地仓库中是否有对应的 jar 包
- 如果有,则在项目直接引用
- 如果没有,则去中央仓库中下载对应的 jar 包到本地仓库
如果搭建远程仓库(私服),jar 包的查找顺序则变为: 本地仓库 --> 远程仓库–> 中央仓库
5. Maven 安装和配置
下载地址:Maven – Download Apache Maven
- 直接解压到没有中文、特殊字符的路径下。
解压后的目录结构如下:
- bin目录:存放的是可执行命令。(mvn 命令重点关注)
- conf目录:存放 Maven 的配置文件。(settings.xml配置文件后期需要修改)
- lib目录:存放 Maven 依赖的jar包。(Maven 也是使用 java 开发的,所以它也依赖其他的 jar 包)
- 配置本地仓库:修改 conf/settings.xml 中的
<localRepository>
为一个指定目录,这个目录是将来存放 jar 包的地方。
<localRepository>D:\Develop\Development Tool\mvn-repository</localRepository>
- 配置阿里云私服:由于中央仓库在国外,所以下载jar包速度可能比较慢,而阿里公司提供了一个远程仓库,里面基本也都有开源项目的jar包。修改 conf/settings.xml 中的
<mirrors>
标签,为其添加如下子标签:
<mirrors>
<!--配置阿里云镜像-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
只可配置一个 <mirror> (另一个要注释) ,不然两个可能发生冲突,导致 jar 包无法下载!!!
- 配置环境变量:MAVEN_HOME 为 Maven 的解压目录,并将其 bin 目录加入 PATH 环境变量。
- 在系统变量处新建一个变量 MAVEN_HOME,值设置为 maven 的解压安装目录
- 在 Path 中进行配置,值设置为 %MAVEN_HOME%\bin
- 打开 cmd 命令提示符进行验证,输入
mvn -v
显示 Maven 版本则成功
6. IDEA 集成 Maven
- 设置 IDEA 使用本地安装的 Maven,并修改配置文件及本地仓库路径
- 配置工程的编译版本和运行版本为 17
在项目中的设置是针对当前项目的设置,再打开别的项目是无效的,关闭项目在 IDEA 欢迎页面的设置才是全局设置。
7. Maven 项目
- 创建空项目
- 创建 Maven 模块
Maven 项目的目录结构如下:
Maven 项目的导入有以下两种方式:
通过右侧 Maven 面板或者在 Project Structure 中导入模块,直接选择对应模块的 pom 文件即可。
8. POM 配置详解
POM (Project Object Model) :指的是项目对象模型,用来描述当前的 Maven 项目。使用 pom.xml 文件来实现,如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- POM模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 当前项目坐标 -->
<groupId>com.baoduo</groupId>
<artifactId>maven_project1</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包方式 -->
<packaging>jar</packaging>
</project>
<project>
:pom 文件的根标签,表示当前 Maven 项目<modelVersion>
:声明项目描述遵循哪一个 POM 模型版本,虽然模型本身的版本很少改变,但它仍然是必不可少的。目前 POM 模型版本是4.0.0- 坐标 :
<groupId>
、<artifactId>
、<version>
,定位项目在本地仓库中的位置 <packaging>
:Maven 项目的打包方式,通常设置为 jar 或 war(默认值:jar)
什么是坐标?
- Maven 中的坐标是资源的唯一标识,通过该坐标可以唯一定位资源位置
- 使用坐标来定义项目或引入项目中需要的依赖
Maven坐标主要组成:
groupId
:定义当前 Maven 项目隶属组织名称(通常是域名反写,例如:com.baoduo)artifactId
:定义当前 Maven 项目名称(通常是模块名称,例如 order-service、goods-service)version
:定义当前项目版本号
注意:
上面所说的资源可以是插件、依赖、当前项目。我们的项目如果被其他的项目依赖时,也是需要坐标来引入的。
9. 依赖管理
9.1 依赖配置
依赖:指当前项目运行所需要的 jar 包。一个项目中可以引入多个依赖。
- 在 pom.xml 中编写
<dependencies>
标签 - 在
<dependencies>
标签中使用<dependency>
引入坐标 - 定义坐标的
<groupId>
、<artifactId>
、<version>
- 点击刷新按钮,引入最新加入的坐标,证每一次引入新的依赖,或者修改现有的依赖配置,都可以加入最新的坐标
添加或修改配置之后记得点击这个小按钮刷新。
如果不知道依赖的坐标信息,可以到Maven Repository: Search/Browse/Explore (mvnrepository.com)中搜索。
还可以使用 IDEA 工具搜索依赖,Alt
+ Insert
中选择 Dependency
直接搜索需要的依赖。
如果引入的依赖在本地仓库不存在,将会连接远程仓库/中央仓库,然后下载依赖。(这个过程会比较耗时,耐心等待)
9.2 依赖传递
依赖具有传递性:
直接依赖:在当前项目中通过依赖配置建立的依赖关系
间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
如下图,projectA 依赖了 projectB。对于projectA 来说,projectB 就是直接依赖。而 projectB 依赖了 projectC 及其他 jar 包。 那么此时,在 projectA 中也会将 projectC 的依赖传递下来。对于projectA 来说,projectC就是间接依赖。
如果 A 依赖 B,B 依赖 C,如果 A 不想将 C 依赖进来,可以使用排除依赖。
排除依赖:指主动断开依赖的资源,被排除的资源无需指定版本。
<!--排除依赖, 主动断开依赖的资源-->
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
9.3 依赖范围
依赖的 jar 包,默认情况下,可以在任何地方使用。可以通过 <scope>…</ scope >
设置其作用范围。
作用范围:
- 主程序范围有效。(main文件夹范围内)
- 测试程序范围有效。(test文件夹范围内)
- 是否参与打包运行。(package指令范围内)
scope
标签的取值范围:
scope值 | 主程序 | 测试程序 | 打包(运行) | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | - | Y | - | junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | jdbc驱动 |
9.4 生命周期
Maven 的生命周期就是为了对所有的构建过程进行抽象和统一。 描述了一次项目构建,经历哪些阶段。在 Maven 出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理,编译,测试及部署。虽然大家都在不停地做构建工作,但公司和公司间、项目和项目间,往往使用不同的方式做类似的工作。
Maven 从大量项目和构建工具中学习和反思,总结了一套高度完美的,易扩展的项目构建生命周期。这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤。
Maven 对项目构建的生命周期划分为3套(相互独立):
- clean:清理工作。
- default:核心工作。如:编译、测试、打包、安装、部署等。
- site:生成报告、发布站点等。
每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。这意味着:在同一套生命周期中,当运行后面的阶段时,前面的阶段都会运行。
我们看到这三套生命周期,里面有很多很多的阶段,这么多生命周期阶段,其实我们常用的并不多,主要关注以下几个:
• clean:移除上一次构建生成的文件,target 目录会被清除
• compile:编译项目源代码,将 class 字节码文件放在 target 目录下
• test:使用合适的单元测试框架运行测试(junit)
• package:将编译后的文件打包放在 target 目录下,如:jar、war等
• install:安装项目到本地仓库,也就是将打好的 jar 包安装到本地仓库中
执行指定生命周期的两种方式:
- 在idea中,右侧的 Maven 工具栏,选中对应的生命周期,双击执行。
- 在命令行中,通过命令执行。 mvn clean、 mvn compile…
由于在同一套生命周期中,运行后面的阶段时,前面的阶段都会运行。在 IDEA 的 Maven 面板中可以跳过不想执行的阶段。
Maven 的生命周期是抽象的,这意味着生命周期本身不做任何实际工作。在Maven的设计中,实际任务(如源代码编译)都交由插件来完成。
IDEA工具为了方便程序员使用 Maven 生命周期,在右侧的 Maven 工具栏中,已给出快速访问通道。
10. 附录
10.1 更新依赖索引
有时候给 IDEA 配置完 Maven 仓库信息后,在 IDEA 中依然搜索不到仓库中的 jar 包。这是因为仓库中的 jar 包索引尚未更新到 IDEA 中。这个时候我们就需要更新 IDEA 中 Maven 的索引了,具体做法如下:
打开设置----搜索maven----Repositories----选中本地仓库-----点击Update
10.2 清理 Maven 仓库
初始情况下,我们的本地仓库是没有任何 jar 包的,此时会从私服去下载(如果没有配置,就直接从中央仓库去下载),可能由于网络的原因,jar 包下载不完全,这些不完整的 jar 包都是以 lastUpdated 结尾。此时,Maven 不会再重新下载,我们需要删除这些以 lastUpdated 结尾的文件,然后 Maven 才会再次自动下载这些 jar 包。
如果本地仓库中有很多这样的以 lastUpadted 结尾的文件,可以定义一个批处理文件,在其中编写如下脚本来删除:
set REPOSITORY_PATH=D:\Develop\Development Tool\mvn-repository
rem 正在搜索...
del /s /q %REPOSITORY_PATH%\*.lastUpdated
rem 搜索完毕
pause
上面的 REPOSITORY_PATH=
后面是本地仓库的地址。定义批处理文件 del_lastUpdated.bat (直接创建一个文本文件,命名为 del_lastUpdated,后缀名直接改为 bat 即可 ),需要清理 Maven 仓库的时候双击运行即可删除 Maven 仓库中的残留文件。