MAVEN认知
1、什么是maven
 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
 Maven这个单词来自于意第绪语(犹太语),意为知识的积累,最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目(有各自Ant build文件),仅有细微的差别,而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式发布项目的信息,以及一种简单的方式在多个项目中共享JARs。
 通俗的理解,maven用来管理项目的生命周期,最重要的工程的依赖处理,工程的编译打包处理,依靠各种插件完成很多原来人工做的事情,如生成工程的javadocs,进行工程的单元测试等。
2、maven 的核心概念
2.1、工程坐标
 maven为每一个工程定义了一个唯一坐标,通过开发者(组织)(groupId)、生成物(artifactId)、版本(version) 共同决定的。
 我们从maven仓库中查询依赖,我们通过pom文件去管理以来,包括当前工程的唯一标示都是通过这个坐标来实现的,一起看一个spring的坐标:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.1.8.RELEASE</version>
</dependency>
2.2、仓库
 Maven仓库就是放置所有JAR文件(WAR,ZIP,POM等等)的地方,所有Maven项目可以从同一个Maven仓库中获取自己所需要的依赖JAR,这节省了磁盘资源。此外,由于Maven仓库中所有的JAR都有其自己的坐标,该坐标告诉Maven它的组ID,构件ID,版本,打包方式等等,因此Maven项目可以方便的进行依赖版本管理。
 maven仓库分为两种,一种是本地仓库(.m2),一种是远程仓库。
 运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的。如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件.
远程仓库分为三种:
 中央仓库,中央仓库的镜像,私服。
 maven默认的远程仓库就是MAVEN中央仓库,https://mvnrepository.com/
2.3、POM文件
 POM 代表工程对象模型。它是使用 Maven 工作时的基本组件,是一个 xml 文件。它被放在工程根目录下,文件命名为 pom.xml。
 POM 包含了关于工程和各种配置细节的信息,Maven 使用这些信息构建工程。
 POM 也包含了目标和插件。当执行一个任务或者目标时,Maven 会查找当前目录下的 POM,从其中读取所需要的配置信息,然后执行目标。
3、MAVEN的构建生命周期
 Maven 构建生命周期定义了一个项目构建跟发布的过程。
 一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的:
| 阶段 | 处理 | 描述 | 
|---|---|---|
| 验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 | 
| 编译 compile | 执行编译 | 源代码编译在此阶段完成 | 
| 测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 | 
| 包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 | 
| 检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标 | 
| 安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用 | 
| 部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 | 
为了完成 default 生命周期,这些阶段(包括其他未在上面罗列的生命周期阶段)将被按顺序地执行。
 Maven 有以下三个标准的生命周期:
- clean:项目清理的处理
 - default(或 build):项目部署的处理
 - site:项目站点文档创建的处理
 
3.1、clean生命周期
 当我们执行 mvn pre-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:
- pre-clean:执行一些需要在clean之前完成的工作
 - clean:移除所有上一次构建生成的文件
 - post-clean:执行一些需要在clean之后立刻完成的工作
 
mvn clean 中的 clean 就是上面的 clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行。
3.2、Default生命周期
 构建周期是maven中最重要的周期,包含以下23个阶段:
| 生命周期阶段 | 描述 | 
|---|---|
| validate | 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。 | 
| initialize | 初始化构建状态,例如设置属性。 | 
| generate-sources | 生成编译阶段需要包含的任何源码文件。 | 
| process-sources | 处理源代码,例如,过滤任何值(filter any value)。 | 
| generate-resources | 生成工程包中需要包含的资源文件。 | 
| process-resources | 拷贝和处理资源文件到目的目录中,为打包阶段做准备。 | 
| compile | 编译工程源码。 | 
| process-classes | 处理编译生成的文件,例如 Java Class 字节码的加强和优化。 | 
| generate-test-sources | 生成编译阶段需要包含的任何测试源代码。 | 
| process-test-sources | 处理测试源代码,例如,过滤任何值(filter any values)。 | 
| test-compile | 编译测试源代码到测试目的目录。 | 
| process-test-classes | 处理测试代码文件编译后生成的文件。 | 
| test | 使用适当的单元测试框架(例如JUnit)运行测试。 | 
| prepare-package | 在真正打包之前,为准备打包执行任何必要的操作。 | 
| package | 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。 | 
| pre-integration-test | 在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量。 | 
| integration-test | 处理和部署必须的工程包到集成测试能够运行的环境中。 | 
| post-integration-test | 在集成测试被执行后执行必要的操作。例如,清理环境。 | 
| verify | 运行检查操作来验证工程包是有效的,并满足质量要求。 | 
| install | 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。 | 
| deploy | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。 | 
我们常用的命令 如:mvn compile , mvn test ,mvn package ,mvn install ,mvn deploy这些命令都会在上面阶段中体现。
3.3、Site生命周期
 Maven Site 插件一般用来创建新的报告文档、部署站点等。
- pre-site:执行一些需要在生成站点文档之前完成的工作
 - site:生成项目的站点文档
 - post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
 - site-deploy:将生成的站点文档部署到特定的服务器上
 
4、maven的插件生态
 上面提到的maven构建生命周期中的每一个步骤其实都对应Maven中的一个插件,maven本身所有的功能全部是由插件提供的,上面仅仅是maven默认要执行使用的插件,除此之外maven还有丰富的插件生态。
 官方为此也整理了maven的插件列表:http://maven.apache.org/plugins/index.html