Maven学习(二):使用

190 阅读5分钟

这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战

1. Maven 生命周期

Maven 约定了标准化的项目结构,并通过一套流程来完成项目的编译、打包、发布等,整个流程由多个阶段组成,并最终形成 Maven 的生命周期。

1.1 标准生命周期

Maven 中标准的生命周期有三个,分别是 clean、default、site。

  1. clean,项目清理的处理,用于清理项目中生成的 class 和 jar 文件,包含 pre-clean、clean、post-clean 三个阶段。
  2. default,又叫 build,项目部署的处理,其中主要包含如下阶段
    • validate,校验阶段,检查项目是否满足构建必要条件
    • compile,编译阶段,对项目源码执行编译
    • test,测试阶段,执行项目中的 JUnit 单元测试逻辑
    • package,打包阶段,根据设置将编译后的代码打包为 War 或 Jar 包
    • verify,验证阶段,检查项目包是否存在质量问题
    • install,安装阶段,将项目包安装到本地仓库,其他项目可以引用该依赖
    • deploy,部署阶段,将项目包部署到配置的远程仓库中
  3. site,项目站点文档创建的处理,用于创建新的报告文档、部署站点等,其中包含了 pre-site、site、post-site、site-deploy 阶段。

1.2 生命周期阶段执行

Maven 中可以使用命令来执行某个生命周期的阶段,在该阶段执行时,其之前的所有阶段都会被执行,如 mvn clean 会执行 pre-clean 和 clean 两个阶段。

对于 Maven 中不同的生命周期之间是独立的,如 mvn install 命令仅会顺序执行 default 生命周期中 validate 到 install 的所有阶段。

使用 Maven 命令时还可以同时指定多个阶段,如 mvn clean deploy 是先执行项目的清理处理,再执行 default 生命周期中 validate 到 deploy 的所有阶段,最终将构建的项目发布到共享仓库中。

Maven 执行生命周期阶段时本质上是在执行该阶段默认的 goal ,类似 Java 中的函数,如 mvn compile 实际执行阶段中 compiler:compile

2. Maven 依赖管理

2.1 Project Object Model

Project Object Model 即 POM,项目对象模型,作为 XML 文件用于描述项目的依赖和构建信息。

Maven 在执行时,会检查项目中的 POM 文件,即 pom.xml,根据其中的配置信息来执行项目任务。

POM 文件中可以指定的配置包括有:

  • 项目的基础信息,包括项目组 ID 、项目 ID、版本、项目名称和描述等
  • parent 标签中定义的项目 Super POM 信息
  • properties 标签中定义的项目属性信息,作为 POM 中变量使用
  • dependencies 标签中定义的项目依赖信息
  • build 标签中定义的项目构建信息

2.2 引入依赖信息

Maven 中引入一个外部依赖十分简单,只需要在 POM 文件中配置该依赖在仓库中的坐标信息,使用时 Maven 会自动获取该坐标对应的依赖包。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.6.3</version>
    </dependency>
</dependencies>

如果想要在引入依赖的同时移除其中的子依赖信息,可以在 dependency 中使用 exclusions 标签。

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.2.6</version>
        <!-- 排除冲突依赖 -->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-json</artifactId>
            </exclusion>
        </exclusions>
</dependency>

2.3 Maven 仓库

Maven 仓库是用来存放第三方依赖包的地方,并在 POM 文件中通过坐标描述在仓库中唯一指定依赖信息。

Maven 仓库按照类型可以分为本地仓库、中央仓库和远程仓库。

  • local,本地仓库,本地首次执行 Maven 命令时会生成本地仓库来存储从远程下载的需要的依赖信息,并在之后执行时直接使用。
  • central,中央仓库,是 Maven 官方维护的仓库,当项目依赖信息在本地寻找不到时,会到中央仓库中寻找,并将找到的依赖下载至本地。
  • remote,远程仓库,Maven 允许开发人员自定义项目的远程仓库信息,以避免在中央仓库找不到依赖后输出错误,开发人员可以创建私有的远程仓库并提供相关依赖信息。

实际使用 Maven 命令时,依赖信息首先会在本地仓库查找,如果找不到则到中央仓库中查找并下载到本地仓库;如果仍然找不到,则会到指定的远程仓库中寻找并下载到本地仓库;当远程仓库不存在或找不到依赖时均会抛出错误信息。

2.4 Maven 插件 Plugins

Maven本质上是一个插件执行框架,所有的工作都是由插件来完成的。

如 1.2 中提到使用命令执行生命周期中阶段时,实际上就是通过 Maven 插件完成的。

Maven 插件通常定义在 POM 文件中的 plugins 标签中,通过 phase 标签指定插件对应阶段,并且针对每个插件,可以使用 goals 标签设置多个目标,使用 tasks 标签设置插件的执行任务。

常见的 Maven 标准插件有:

  • clean,清理目标文件,对应 clean 阶段

  • compiler,编译文件,对应 compile 阶段

  • surefile,执行 JUnit 单元测试,对应 test 阶段

  • jar,构建项目为 jar 包,对应 package 阶段

  • war,构建项目为 war 包,对应 package 阶段

  • javadoc,生成 Javadoc 文档

  • antrun,构建阶段中允许 ant 任务 对于 Maven 中自带的标准插件,使用时并不需要声明,而引入其他插件时需要声明后使用。