一、什么是Maven?
Apache Maven是由Apache软件基金会所所提供的一个软件项目管理及自动构建工具。它包含:一个项目对象模型、一组标准集合、一个项目生命周期、一个依赖管理系统、运行定义在生命周期阶段中插件目标的逻辑。
二、maven内容
2.1项目对象模型
每个maven管理的项目都拥有一个pom.xml,一个pom文件即可理解为一个项目对象模型。当Maven运行时,它向项目对象模型(pom)查看项目信息。
最小pom.xml配置如下
groupId、artifactId、version为坐标必要要素,定义项目唯一标识。
Maven遵守“优先大于配置”原则。实际项目开发中,pom配置要复杂得多。可通过 mvn help:effective-pom 命令 查看Maven完整默认配置。
2.2 一组标准集合
Maven为整个项目管理过程定义一组标准。主要包括:
1. 标准的目录结构(参考:Maven – Introduction to the Standard Directory Layout)
2.标准的生命周期
3.标准的坐标定义
2.3 项目生命周期
Maven包含三个独立的生命周期。
clean:项目清理的处理
default(或 build):项目部署的处理
site:项目站点文档创建的处理
每个生命周期划分为多个阶段。详情可参考 Maven – Introduction to the Build Lifecycle
随着Maven沿着生命周期阶段移动,它会执行附着在特定阶段上的目标。每个阶段可能绑定零个或多个目标。
执行某个阶段命令时,首先会执行前面所有的阶段
2.4 依赖管理系统
2.4.1 Maven依赖
每个Maven项目通过坐标确定唯一性。在pom.xml <dependencies>标签中配置依赖项坐标。
Maven依赖范围
compile(默认):编译,测试,运行有效均
provided:编译和测试classpath有效,运行时无效。(例:servlet-ap,编译和测试项目时需要。运行时由容器提供)
runtime:测试和运行时classpath有效,编译时无效。(例:JDBC驱动实现)
test:测试classpath有效
system:与provided依赖范围一致,但必须systemPath元素显示的指定依赖文件路径
import:仅pom在本<dependencyManagement>节中的类型依赖项上支持此作用域。
Maven依赖具有传递性(非compile依赖不能传递)。
例:项目B依赖项目C,项目A依赖项目B,则项目A自动引入项目C,无需在项目A中重复声明。
注:若有相同依赖,则传递性以路径最短优先。路径相同则以最先声明优先。
Maven继承机制
Maven通过在子项目添加<parent/>配置声明继承关系。
<dependencies/>:子项目会自动引入父项目<dependencies/>中的依赖。
<dependcyManagement/>:父项目<dependcyManagement/>中定义依赖统一版本号,子项目若使用了其中某个依赖,无需指定版本号。
Maven聚合
Maven通过父项目中添加<modules/>配置声明聚合关系。
聚合主要用于多模块项目,可通过一条命令构建所有聚合模块
2.4.2 Maven仓库
Maven中任何一个依赖、插件、项目构建的输出都称为构建。maven仓库帮组我们管理这些构建。
主要分为本地仓库(第一次执行Maven命令时创建)、远程仓库(私服、中央仓库、中央仓库镜像)。本地和远程存储库的结构相同。
运行maven时,Maven所需要的构建直接从本地仓库获取。如果本地仓库没有,它会首先舱室从远程仓库下载构建至本地仓库,然后再使用本地仓库的构建。
2.5插件与目标
Maven核心仅解析xml文档、管理生命周期和插件。maven大部分功能都是由插件实现,而插件从Maven仓库获得,第一次运行命令时Maven会从中央仓库下载大部分核心插件。一个插件包含一个或多个目标。一个目标是一个明确的任务(可以作为单独的目标运行,也可作为一个大的构建的一部分和其它目标一起运行)。
Maven插件主要分为
构建插件:构建期间执行,在<build/>中配置
报告插件:在网站生成期间执行,在<reporting/>中配置
2.6 Maven命令
Maven主要分为两种类型的命令
单个插件目标命令。(例:mvn mybatis-generator:generate)
生命周期阶段命令。(例:mvn package)
三、总结
Maven通过一组标准集合约束了不同项目的差异,节约了跨项目学习、开发成本。项目对象模型和依赖管理简化了项目开发中对于第三方依赖的配置管理。微内核插件模式大大提高扩展性。
参考:
《Maven权威指南》