基础概念
依赖管理
maven中的的依赖以groupid, artificartid, version三个坐标进行指定
依赖关系的生命周期
指定了某一个依赖以后, 还需要指定这个依赖与这个工程的编译关系,maven定义了4种依赖关系,
- compiler,编译时需要这个依赖包。
- test,测试时需要这个jar包。
- tuntime,运行时才需要这个jar包,编译时不需要。
- provider,编译时用到,但运行时由别的工程提供。
构建流程
maven构建流程中由三个概念组成,lifecycle,phase,goal。
简略概括:
goal:由插件预先定义好能做什么,配置插件的时候就可以指定它做什么
phase:编译打包链条中的某一个阶段,定义的是这个插件什么时候做
lifecycle:定义的是这个打包链条包含了哪些阶段
生命周期
maven发版默认有三套生命周期
clean生命周期
clean 生命周期的目的是清理项目,它包括以下三个phase。
phase | 说明 |
---|---|
pre-clean | 执行清理前需要完成的工作。 |
clean | 清理上一次构建过程中生成的文件,比如编译后的 class 文件等。 |
post-clean | 执行清理后需要完成的工作。 |
default生命周期
phase | 说明 |
---|---|
validate | 验证项目结构是否正常,必要的配置文件是否存在 |
initialize | 做构建前的初始化操作,比如初始化参数、创建必要的目录等 |
generate-sources | 产生在编译过程中需要的源代码 |
process-sources | 处理源代码,比如过滤值 |
generate-resources | 产生主代码中的资源在 classpath 中的包 |
process-resources | 将资源文件复制到 classpath 的对应包中 |
compile | 编译项目中的源代码 |
process-classes | 产生编译过程中生成的文件 |
generate-test-sources | 产生编译过程中测试相关的代码 |
process-test-sources | 处理测试代码 |
generate-test-resources | 产生测试中资源在 classpath 中的包 |
process-test-resources | 将测试资源复制到 classpath 中 |
test-compile | 编译测试代码 |
process-test-classes | 产生编译测试代码过程的文件 |
test | 运行测试案例 |
prepare-package | 处理打包前需要初始化的准备工作 |
package | 将编译后的 class 和资源打包成压缩文件,比如 rar |
pre-integration-test | 做好集成测试前的准备工作,比如集成环境的参数设置 |
integration-test | 集成测试 |
post-integration-test | 完成集成测试后的收尾工作,比如清理集成环境的值 |
verify | 检测测试后的包是否完好 |
install | 将打包的组件以构件的形式,安装到本地依赖仓库中,以便共享给本地的其他项目 |
deploy | 运行集成和发布环境,将测试后的最终包以构件的方式发布到远程仓库中,方便所有程序员共享 |
site生命周期
phase | 说明 |
---|---|
pre-site | 执行生成站点前的准备工作。 |
site | 生成站点文档。 |
post-site | 执行生成站点后需要收尾的工作。 |
site-deploy | 将生成的站点发布到服务器上。 |
lifecycle由一连串顺序的phase指定,mvn命令中执行的辨识phase,maven命令只知道执行的phase。
在pom文件中,可以将插件与phase绑定,在这个phase的时候执行这个插件。插件中又会有多个goal,所以还要指定执行的是这个插件的哪个goal。goal便是maven编译过程的最小的单元。
maven插件
上面可以知道,maven只知道执行到lifecycle中的哪一个phase,并不知道如何执行,它只负责lifecycle中对应phase中的所有插件找出来,并执行这个这些插件的对应的某个goal。
maven发版时便已经自带了一些插件:
插件名称 | 对应的phase |
---|---|
clean | clean |
compiler | compiler |
surefire | test |
jar | package |
命令语法
mvn <插件名称 | 插件前缀>:<目标>[-Dkey=value]目标> |
分析命令
mvn dependency:tree
上面的这个命令中dependency前缀执行的是maven-dependency-plugin插件。
获取插件
目前,除了自定义插件,公共插件大部分来自与Apache和Codehaus。
http://maven.apache.org/plugins/index.html
使用的时候官方的插件可以不写groupid,默认不写的时候会自动带上org.apache.maven.plugins的groupid。
插件仓库
插件仓库需要单独在setting文件中进行配置,告诉maven本地没有这个插件的时候去哪里获取远端插件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<pluginRepositories>
<pluginRepository>
<id>central</id>
<name>Maven Plugin Repository</name>
<url>http://repo1.maven.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
</pluginRepository>
</pluginRepositories>
插件前缀
前面说的maven可以通过前缀来关联maven插件,那么究竟是如何关联的呢?
maven发版的时候会将这种关系保存在maven插件仓库的一个元数据文件中, maven-metedata-仓库名.xml
maven发版的时候会默认使用 org.apache.maven.plugins 和 org.codehaus.mojo 两个 groupId来获取这个插件与前缀关联的元数据,可以通过修改setting.xml中的配置来让他查找别的groupId的元数据。
1
2
3
4
5
<settings>
<pluginGroups>
<pluginGroup>cn.com.demo.plugins</pluginGroup>
</pluginGroups>
</settings>
前缀查找的流程, 会从一个个的元数据文件中查找,所有的元数据都查找不到这个前缀关联的插件的时候就会报错。
常用插件
maven有一个约定,如果插件的名字叫maven-xxxx-plugin或xxxx-maven-plugin的话。可以直接用mvn xxxx:goal的方式调用其提供的功能