Maven的定义:
Apache Maven 是一套软件工程管理和整合工具。基于工程对象模型(POM)的概念,通过一个中央信息管理模块,Maven 能够管理项目的构建、报告和文档。
Maven能做什么?
构建
文档生成
报告
依赖
SCMs
发布
分发
邮件列表
主要是能简化工程的构建过程,使其标准化。
POM
是一个xml文件,包含了工程和各种配置细节的信息。必须包含project元素和三个必须的字段:groupId, artifactId,version。通过这三个标识在中央仓库中确定位置。
节点
描述
groupId
这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.company.bank 拥有所有的和银行相关的项目。公司名或组织名
artifactId
这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置。项目名或项目名-子项目名
version
这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本。例如: com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1.
查看 Super POM(父POM)默认配置的一个简单方法是执行以下命令:
mvn help:effective-pom
构建生命周期
Maven有三个标准的生命周期
clean:用于删除构建目录。
default(or build):有编译,测试,打包,部署等等操作都是在这个一个阶段进行。
site:一般用来创建新的报告文档、部署站点。
1.clean 包含以下阶段:
pre-clean
clean
post-clean
2.default(or build)有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
拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。
- site有以下阶段:
pre-site
site
post-site
site-deploy
构建配置文件
Profile 在 pom.xml 中使用 activeProfiles / profiles 元素指定,并且可以用很多方式触发。Profile 在构建时修改 POM,可以为不同的环境定制构建过程,比如开发环境,测试环境,产品环境。
Profile 主要有三种类型:
类型
在哪里定义
Per Project
定义在工程 POM 文件 pom.xml 中
Per User
定义在 Maven 设置 xml 文件中 (%USER_HOME%/.m2/settings.xml)
Global
定义在 Maven 全局配置 xml 文件中 (%M2_HOME%/conf/settings.xml)
Profile 有以下几种方式激活:
显式使用命令控制台输入
通过 maven 设置
基于环境变量(用户 / 系统变量)
操作系统配置(例如,Windows family)
现存 / 缺失 文件具体怎么激活还是需要项目实战才会有深刻的印象,这里就不具体描述了,不懂的话就去google
仓库
用来放置存储所有的工程 jar 文件、libraryjar文件、插件或任何其他的工程指定的文件。
本地仓库:本机上的文件夹。
中央仓库:由Maven社区管理,不需要配置,需要通过网络才能访问。
远程仓库:由开发人员自己定制的仓库。
Maven依赖搜寻顺序:
步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤4,如果找到了则下载到本地仓库中已被将来引用。
步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库已被将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。
插件
执行插件的语法如下:
mvn [plugin-name]:[goal-name] ;插件名称:目标名称
插件是在 pom.xml 中使用 plugins 元素定义的。
每个插件可以有多个目标。
你可以定义阶段,插件会使用它的 phase元素开始处理。我们已经使用了 clean 阶段。
你可以通过绑定到插件的目标的方式来配置要执行的任务。我们已经绑定了 echo 任务到 maven-antrun-plugin 的 run 目标。
就是这样,Maven 将处理剩下的事情。它将下载本地仓库中获取不到的插件,并开始处理。插件我是这么理解的,就是感觉跟使用bash命令差不多。
依赖关系
1.传递性依赖
不用担心引入多余的依赖,Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中去。1. 路径最近者优先。2. 第一声明者优先,即顺序最靠前的那个依赖优先
2.排除依赖
声明exclusion的时候只需要groupId和artifactId即可,而不需要version元素,这是因为只需要groupId和artifactId就能唯一定位依赖图中的某个依赖。换句话说,Maven解析后的依赖中,不可能出现groupId和artifactId相同,但是version不同的两个依赖。
总结:
这个应该是在成熟的团队使用的。顺便了解下也是不错的。提高篇的传送门 以下是推荐类似功能的工具,思路都差不多。我错过了ant时代,我也错过了maven时代,但我不能错过gradle时代!