参考:
极客学院Maven教程 http://wiki.jikexueyuan.com/project/maven/overview.html
关于Maven http://www.trinea.cn/android/maven/
Maven依赖 https://segmentfault.com/a/1190000000640821
Maven的setting.pom配置 https://www.cnblogs.com/yanghongfei/p/6995613.html
官方文档 http://maven.apache.org/settings.html
一.Maven概述
1.Maven是什么
- 项目管理和整合工具
- 简化工程构建过程,帮助完成 构建、文档生成、报告、依赖、SCMs、发布、分发、邮件列表 等工作
- 构建(Build)包括编译、运行单元测试、生成文档、打包和部署等一系列工作
- Maven遵循约定优于配置的原则,为工程提供了合理的默认过程。如下表格展示了工程源码文件和资源文件的默认配置,假定${basedir}表示工程目录
配置项 |
默认值 |
source code |
${basedir}/src/main/java |
resources |
${basedir}/src/main/resources |
Tests |
${basedir}/src/test |
Compiled byte code |
${basedir}/target |
distributable JAR |
${basedir}/target/classes |
2.Maven仓库(Repository)
- 仓库是一个可以存储所有的工程Jar/Library Jar/插件的位置(如目录),包含3类:
1)本地仓库:本地机器保存依赖Jar包的文件夹
2)中央仓库:Maven社区提供的网络仓库,包含你大量常用库
3)远程仓库:开发人员自行定制的网络仓库
- 构建时Maven按照 本地---中央---远程 的顺序查找依赖的库
3.Maven插件
- Maven是一个依赖插件执行的框架,每个任务实际上由插件完成
- Maven提供以下两种类型插件
类型 |
描述 |
Build plugins |
构建时执行,在pom.xml的元素中配置 |
Reporting plugins |
网站生成过程中执行,在pom.xml的元素中配置 |
插件 |
描述 |
clean |
构建后清理目标文件。删除目标目录 |
compiler |
编译Java源文件 |
surefile |
运行JUnit单元测试。创建测试报告 |
jar |
从当前工程中构建Jar文件 |
war |
从当前工程中构建War文件 |
javadoc |
为工程生成Javadoc |
antrun |
从构建过程的任意一个阶段中运行一个ant任务的集合 |
4.pom.xml
- pom代表工程对象模型,是使用Maven工作时的基本组件
- pom包含关于工程和各种配置细节的信息,Maven使用这些信息构建工程
- pom中常用配置包含
1)project dependency
2)plugins
3)goals
4)build profiles
5)project version
6)developers
7)mailing list
- pom通过groupId:artifactId:version确定仓库中的工程
节点 |
描述 |
groupId |
工程组标识 |
artifactId |
工程标识,通常是工程名称 |
version |
工程版本号 |
5.setting.xml
- 全局配置和用户配置
1)全局配置位置:maven安装目录/conf/settings.xml
2)用户配置位置:用户主目录/.m2/settings.xml
- 主要配置项
1)localRepository:本地仓库,默认为用户主目录/.m2/repository
2)offline:构建系统是否需要离线运行,默认true
3)pluginGroups:插件默认组织的Id,默认包含org.apache.maven.plugins
4)proxies:代理
5)servers:服务端设置,包括服务器id、鉴权用户名、鉴权密码、鉴权使用私钥的位置等
6)mirrors:为仓库列表配置的下载镜像,包括镜像id、镜像名称、URL等
7)profiles:根据环境参数来调整构建配置的列表,包括激活(activation)、仓库(repositories)、插件仓库(pluginRepositories)、属性(properties)共四个子元素。其中activation节点配置profile的激活条件,常见条件有根据os(操作系统)、jdk(jdk版本)、property(属性值)、file(文件是否存在)
8)repositories:远程仓库列表
二.Maven构建生命周期和常用命令
1.构建生命周期
- 构建生命周期是一组阶段的序列(sequences of phases)
- 每个阶段定义了目标被执行的顺序
- 典型的一个Maven构建生命周期包括
1)prepare-resources(资源拷贝)
2)compile(编译)
3)package(打包)
4)install(安装)
2.Maven三个标准生命周期
- clean:处理项目的清除
1)pre-clean
2)clean
3)post-clean
- default(or build):处理项目的部署
- site:处理项目的文档生成
1)pre-site
2)site
3)post-site
4)site-deploy
3.default(or Build)生命周期
生命周期阶段 |
描述 |
validate |
检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到 |
initialize |
初始化构建状态,例如设置属性 |
generate-sources |
生成编译阶段需要包含的任何源码文件 |
process-sources |
处理源代码 |
generate-resources |
生成工程包中需要包含的资源文件 |
process-resources |
拷贝和处理资源文件到目的目录中,为打包阶段做准备 |
compile |
编译工程源码 |
process-classes |
处理编译生成的文件,例如Java Class字节码的加强和优化 |
generate-test-sources |
生成编译阶段需要包含的任何测试源代码 |
process-test-sources |
处理测试源代码 |
test-compile |
编译测试源代码到测试目的目录 |
process-test-classes |
处理测试代码文件编译后生成的文件 |
test |
使用适当的单元测试框架(如JUnit)运行测试 |
prepare-package |
在打包之前,完成打包的准备工作 |
package |
获取编译后的代码,按照可发布的格式进行打包 |
pre-integration-test |
在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量 |
integration-test |
处理和部署必须的工程包到集成测试能够运行的环境中 |
post-integration-test |
在集成测试被执行后执行必要的操作。例如,清理环境 |
verify |
运行检查操作来验证工程包是有效的,并满足质量要求 |
install |
安装工程包到本地仓库,该仓库可作为本地其他工程的依赖 |
deploy |
拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 |
4..Maven常用命令
- mvn test-compile 编译测试代码
- mvn test 运行程序中的单元测试
- mvn compile 编译项目
- mvn package 打包(target目录生成 maven-quickstart-1.0.SNAPSHOT.jar 文件)
- mvn install 打包并安装到本地仓库(本地仓库新增 maven-quickstart-1.0.SNAPSHOT.jar 文件)
- mvn eclipse:eclipse 生成eclipse项目文件
- mvn eclipse:clean 清除eclipse项目文件
- mvn site 生成项目相关信息的网站
三.Maven依赖
1.dependency标签
- groupId,artifactId,version:依赖的基本坐标
- type:依赖的类型,默认为jar
- scope:依赖范围
- optional:标记依赖是否可选
- exclusions:用来排除传递性依赖
2.依赖范围
- Maven通过作用域(scope)使程序对外部的依赖随程序所处的阶段和应用场景而变化
- scope包括compile(编译范围),provided(已提供范围),runtime(运行时范围),test(测试范围),system(系统范围)
Scope |
compile classpath |
test classpath |
runtime classpath |
例子 |
compile |
Y |
Y |
Y |
spring-core |
test |
|
Y |
|
JUnit |
provided |
Y |
Y |
|
servlet-api |
runtime |
|
Y |
Y |
JDBC驱动 |
system |
Y |
Y |
|
|
3.传递性依赖
- A依赖于B,B依赖于C,则C是A的传递性依赖
- 传递性依赖产生依赖冲突时将进行依赖仲裁
- <dependency>的<exclusions>元素可排除引起冲突的依赖
4.依赖仲裁
- 第一原则:最短路径优先
项目有依赖关系A->B->C->X(1.0)和A->D->X(2.0),则将使用X(2.0)
- 第二原则:第一声明优先
项目有依赖关系A->B->Y(1.0)和A->C->Y(2.0),若B的依赖声明在C之前,则使用Y(2.0)
四.其他
1.模块聚合和项目继承
- 模块聚合:使用<module>元素声明要聚合的模块
- 项目继承:子模块中定义<parent>元素
千古风流今在此,万里功名莫放休。君王三百州
网友评论