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 就可以看到文档了。

浙公网安备 33010602011771号