Maven

概述

Maven 是一个项目管理和整合工具。Maven 为开发者提供了一套完整的构建生命周期框架。开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置,因为 Maven 使用了一个标准的目录结构和一个默认的构建生命周期。

Maven 能够帮助开发者完成以下工作:

  • 构建
  • 文档生成
  • 报告
  • 依赖
  • SCMs
  • 发布
  • 分发
  • 邮件列表

无缝衔接了编译、发布、文档生成、团队合作和其他任务。Maven 提高了重用性,负责了大部分构建相关的任务。

Maven 的主要目的是为开发者提供

  • 一个可复用、可维护、更易理解的工程综合模型
  • 与这个模型交互的插件或者工具

Maven 工程结构和内容被定义在一个 xml 文件中 - pom.xml,是 Project Object Model (POM) 的简称,此文件是整个 Maven 系统的基础组件。

POM

POM代表工程对象模型,是xml文件,使用Maven工作时的基本组建,包含了关于工程和各种配置细节的信息,Maven使用这些信息构建工程。

能够在 POM 中设置的一些配置如下:

  • project dependencies
  • plugins
  • goals
  • build profiles
  • project version
  • developers
  • mailing list
POM举例
<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">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.companyname.project-group</groupId>
   <artifactId>project</artifactId>
   <version>1.0</version>

</project>

每个工程应该只有一个 POM 文件。

  • 所有的 POM 文件需要 project 元素和三个必须的字段:groupId, artifactId,version
  • 在仓库中的工程标识为 groupId:artifactId:version
  • POM.xml 的根元素是 project,它有三个主要的子节点
    • groupId:工程组的标识,通常在项目中是唯一的
    • artifactId:工程的标识,通常是工程的名称
      • groupId和artifactId一起定义了artifact在仓库中的位置
    • version:工程的版本号,用来区分不同的版本

构建生命周期

构建生命周期是一组阶段的序列(sequence of phases),每个阶段定义了目标被执行的顺序。这里的阶段是生命周期的一部分。

一个典型的Maven构建生命周期是由以下几个阶段的序列组成的:

  • prepare-resources 资源拷贝,本阶段可以自定义需要拷贝的资源
  • compile 编译,本阶段完成源代码编译
  • package 打包,本阶段根据pom.xml中描述的打包配置创建JAR/WAR包
  • install 安装,本阶段在本地/远程仓库中安装工程包

当 Maven 开始构建工程,会按照所定义的阶段序列的顺序执行每个阶段注册的目标。Maven 有以下三个标准的生命周期:

  • clean
  • default(or build)
  • site
clean生命周期

当我们执行mvn post-clean 命令时,Maven调用clean生命周期,包含pre-clean, clean, post-clean几个阶段。

Maven 的 clean 目标(clean:clean)绑定到了 clean 生命周期的 clean 阶段。它的 clean:clean 目标通过删除构建目录删除了构建输出。所以当 mvn clean 命令执行时,Maven 删除了构建目录。

Default(or Build)生命周期

是Maven主要的生命周期,被用于构建应用,包括23个阶段

  • validate检查工程配置是否正确
  • initialize初始化构建状态,例如设置属性
  • generate-sources生成编译阶段需要包含的任何源码文件
  • process-sources处理源代码
  • generate-resources生成工程包中需要包含的资源文件
  • process-resources拷贝和处理资源文件到目的目录中,为打包阶段做准备
  • compile编译工程源码
  • process-classes处理编译生成的文件
  • generate-test-sources生成编译阶段需要包含的任何测试源代码
  • process-test-sources处理测试源代码
  • test-compile编译测试源代码到测试目的目录
  • process-test-classes处理测试代码文件编译后生成的文件
  • test使用适当的单元测试框架运行测试
  • prepare-package在真正打包之前,为准备打包执行任何必要的操作
  • package获取编译后的代码,并按照可发布的格式进行打包
  • pre-integration-test在集成测试执行之前,执行所需的操作
  • integration-test处理和部署必须的工程包到集成测试能够运行的环境中
  • post-integration-test在集成测试被执行后执行必要的操作
  • verify运行检查操作来验证工程包是有效的,并满足质量要求
  • install安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖
  • deploy拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
Site生命周期

Maven Site 插件一般用来创建新的报告文档、部署站点等。

阶段:

  • pre-site
  • site
  • post-site
  • site-deploy

构建配置文件

构建配置文件是一组配置的集合,用来设置或者覆盖 Maven 构建的默认配置。使用构建配置文件,可以为不同的环境定制构建过程,例如 Producation 和 Development 环境。

Profile 在 pom.xml 中使用 activeProfiles / profiles 元素指定,并且可以用很多方式触发。Profile 在构建时修改 POM,并且为变量设置不同的目标环境(例如,在开发、测试和产品环境中的数据库服务器路径)。

仓库

仓库是一个位置(place),例如目录,可以存储所有的工程 jar 文件、library jar 文件、插件或任何其他的工程指定的文件。

Maven 仓库有三种类型:

  • 本地(local)
  • 中央(central)
  • 远程(remote)
本地仓库

Maven 本地仓库保存你的工程的所有依赖(library jar、plugin jar 等)。当你运行一次 Maven 构建,Maven 会自动下载所有依赖的 jar 文件到本地仓库中。它避免了每次构建时都引用存放在远程机器上的依赖文件。

中央仓库

Maven 中央仓库是由 Maven 社区提供的仓库,其中包含了大量常用的库。

不需要配置,由Maven社区管理,需要通过网络才能访问

远程仓库

如果 Maven 在中央仓库中也找不到依赖的库文件,它会停止构建过程并输出错误信息到控制台。为避免这种情况,Maven 提供了远程仓库的概念,它是开发人员自己定制仓库,包含了所需要的代码库或者其他工程中用到的 jar 文件。

Maven 依赖搜索顺序

当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:

  • 步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
  • 步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中已被将来引用。
  • 步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
  • 步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库已被将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。

插件

Maven 实际上是一个依赖插件执行的框架,每个任务实际上是由插件完成。Maven 插件通常被用来:

  • 创建 jar 文件
  • 创建 war 文件
  • 编译代码文件
  • 代码单元测试
  • 创建工程文档
  • 创建工程报告

Maven提供两种类型的插件:

  • Build plugins 在构建时执行,并在pom.xml的元素中配置
  • Reporting plugins 在网站生成过程中执行,并在pom.xml的元素中配置

创建工程

Maven 使用原型(archetype)插件创建工程。要创建一个简单的 Java 应用,我们将使用 maven-archetype-quickstart 插件。

终端在文件夹路径下

>mvn archetype:generate
-DgroupId=
-DartifactId=
-DarchetypeArtifactId=maven-archetype-quickstart 
-DinteractiveMode=false

构建&测试工程

在上面创建的java应用目录下,打开consumerBanking 文件夹。你将看到 POM.xml 文件中已经添加了JUnit作为测试框架,打开Terminal,跳转到consumerBanking目录下,并执行以下命令:

> mvn clean package

将开始构建工程。

此命令给了maven两个目标,首先清理目标目录(clean),然后打包工程构建的输出为jar(package)文件。打包好的jar文件在consumerBanking/target中,测试报告在consumerBanking\target\surefire-reports中。

工程文档

创建应用程序的文档:> mvn site

打开MVN\consumerBanking\target\site 文件夹,点击 index.html 就可以看到文档了。

posted @ 2021-07-07 15:14  GladysChloe  阅读(77)  评论(0)    收藏  举报