首页 Maven入门
文章
取消

Maven入门

基础概念

依赖管理

maven中的的依赖以groupid, artificartid, version三个坐标进行指定

依赖关系的生命周期

指定了某一个依赖以后, 还需要指定这个依赖与这个工程的编译关系,maven定义了4种依赖关系,

  1. compiler,编译时需要这个依赖包。
  2. test,测试时需要这个jar包。
  3. tuntime,运行时才需要这个jar包,编译时不需要。
  4. 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
cleanclean
compilercompiler
surefiretest
jarpackage

命令语法

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的方式调用其提供的功能

本文由作者按照 CC BY 4.0 进行授权

并发基础 - 术语扫盲

并发工具 - Reference