什么是生命周期?
生命周期,说白了,就是从出生到挂掉中间的一些列过程。相信做过web开发的人对servlet的生命周期不陌生。同理,人的这一生,生命周期基本可以分为呱呱落地、幼儿园、小学初中高中大学、工作、退休,到最后挂在墙上。
maven的生命周期
人的生命周期对人的一生抽象,同样,maven的生命周期对构建的过程进行了抽象和统一。Maven的生命周期包含项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等。
maven抽象了三套生命周期,可以理解为将项目的构建过程分了一个类,每一类都是一个小的生命周期
maven抽象了三套生命周期,clean、default、site,每套生命周期包含多个任务,一个任务成为一个阶段。
clean:项目清理
default:包含一系列关键的构建动作
site:项目站点报告相关
我们要执行某个构建任务,可以使用这些生命周期阶段,比如,在命令行中,执行mvn clean,对应的就是clean生命周期的clean阶段,mvn install对应的就是default生命周期的install阶段,同理,在IDE中运行maven命令也是一样。
生命周期之间相互独立,生命周期阶段有顺序,后面的阶段依赖前面的阶段
生命周期之间相互独立,是说不同生命周期之间没有关联,比如执行clean生命周期的clean阶段,不会影响default生命周期的阶段;而同一套生命周期内部,生命周期阶段之间是有顺序的,上图列出了重要生命周期的顺序,从上到下,比如,在执行mvn install是,在default生命周期中,位于install之前的阶段都会依次执行,maven内部会先执行validate、...compile...,一直到install为止。
不同生命周期的阶段可以组合使用,如在测试或安装前,一般需要先清理上次构建的输出,那么可以组合clean和test或package,如mvn clean test,maven会先执行clean生命周期的相应阶段、default生命周期的从头到test阶段的所有阶段。
插件
插件的概念大家都不陌生,比如,eclipse就有众多的插件,需要什么功能,添加相应的插件就可以。maven也是基于插件的机制实现的。其实,之前讲述的生命周期的不同阶段完成的任务,都是通过相应的插件来完成的,生命周期本身不能工作,具体的任务由相应的插件完成。
一个插件会提供多个功能,一个功能就是一个目标(goal)。
我们会发现,在安装完maven后,我们基本没做什么,就已经能通过mvn clean、mvn test、mvn install这行命令执行相应的构建任务了,我们又说过,这些任务是由相应的插件完成的,但是,这些插件我们并没有配置,那怎么会工作呢?这是因为maven默认已经内置了常用插件的配置,这又是maven约定大于配置的体现。maven内置的常用插件如下:
上图中间一列列出了插件及对应的目标,一个插件可能会有多个目标,每个目标完成相应的任务,比如,我们在编译项目时,编译任务是由maven-compile-plugin完成的,它有两个目标,compile和testCompile,分别用于编译主代码和测试代码。
前面提到过,生命周期本身是抽象的,就好比接口一样,本身不能工作,但是为什么我们执行说过,我们执行生命周期的相应阶段,比如mvn clean install,clean和install分别是clean生命周期和default生命周期的阶段,他们是生命周期,是抽象的,应该不能工作才对,为什么这边输入生命周期阶段maven却能做相应的事呢?这是因为maven默认已经将这些生命周期阶段与相应的插件目标绑定了,上图第一列就是相应的生命周期阶段,第二列是相应的生命周期阶段对应的插件目标,因此,我们在输入生命周期阶段时,maven会找对应的插件的目标执行,因此,在命令行输入mvn clean和mvn maven-clean-plugin:clean效果是一样的。
maven默认已经内置了常用的插件,用于完成基本的构建任务,但是这些插件还远远不够的,maven提供了大量的插件供我们使用,我们可以在pom文件中配置相应的插件:
在pom的<build>配置元素的子元素<plugins>下配置插件
一个plugin元素代表一个插件,插件也是同过GAV标志,execution代表一个绑定,将生命周期的阶段与插件的一个目标绑定,这样,在命令行输入生命周期阶段时,就会执行对应的插件的目标,完成相应的任务。
插件仓库
同构件仓库一样,我们在第五章中介绍了仓库的配置,那只对普通的jar包有效,插件有独立的仓库,配置方式同jar包的仓库类似
只不过配置元素变位pluginRepository
maven提供了很多插件,可以在maven官网上查看,地址如下
http://maven.apache.org/plugins/index.html
到目前为止,我们理解了那些maven命令背后的含义,我们可以使用生命周期阶段来执行相应的构建任务,但是这些生命周期本省是不能工作的,maven将这些生命周期阶段绑定到了相应的插件的目标,执行这些生命周期阶段时,背后其实执行的是相应插件的目标,来完成相应的任务。