Maven用户都应该知道的一些事:构建生命周期和插件

Maven的所有实际操作都是由插件完成的,如果没有插件,Maven什么都不会干。
(即时你没有在POM中配置<plugin>元素,Super POM中也已经帮你引入了若干核心插件)

那么问题来了,项目构建过程中,Maven是怎么知道应该在什么时候调用哪个插件的呢?

插件的调用时机,跟'生命周期'和'插件目标'有很大关系。

插件目标(Plugin Goal)是个什么鬼

首先需要知道的是,Maven的所有具体任务都是交由插件实现的,而一个插件往往能实现若干个任务或功能。又或者可以说一个插件能实现若干个目标,比如编译源码、执行测试用例、打包项目等等。
简单来说,在Maven中Plugin Goal可以看做是插件的一个功能。

Plugin Goal通常用‘插件前缀:插件目标‘的格式描述,常见的有:compiler:compile,surefire:test,dependency:tree等。

所谓插件前缀就是插件的名称的一个简写,比如compiler指的就是maven-complier-plugin这个插件。
compiler:compile的意思既是maven-complier-plugin插件的compile目标。

构建生命周期(Build Lifecycle)又是什么

构建生命周期是对构建过程的抽象和统一,包括了几乎所有的构建步骤,如清理、初始化、编译、测试、打包等等。

Maven为不用的目的定义了3套相互独立的生命周期:

  • clean 用于清理项目
  • default 用于构建项目
  • site 用于构建项目站点

每种生命周期都是由若干阶段(phase)组成,如clean生命周期由pre-clean,clean,post-clean三个阶段组成。

阶段之间是有序的,而且后面的阶段依赖前面的阶段。
用户执行mvn clean时,实际上maven会先执行pre-clean阶段,然后再执行clean阶段;执行mvn post-clean时,则会依次执行pre-clean,clean,post-clean三个阶段。

3个生命周期各自的阶段如下:

Clean Lifecycle

Phase Description
pre-clean execute processes needed prior to the actual project cleaning
clean remove all files generated by the previous build
post-clean execute processes needed to finalize the project cleaning

Default Lifecycle

Phase Description
validate validate the project is correct and all necessary information is available.
initialize initialize build state, e.g. set properties or create directories.
generate-sources generate any source code for inclusion in compilation.
process-sources process the source code, for example to filter any values.
generate-resources generate resources for inclusion in the package.
process-resources copy and process the resources into the destination directory, ready for packaging.
compile compile the source code of the project.
process-classes post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
generate-test-sources generate any test source code for inclusion in compilation.
process-test-sources process the test source code, for example to filter any values.
generate-test-resources create resources for testing.
process-test-resources copy and process the resources into the test destination directory.
test-compile compile the test source code into the test destination directory
process-test-classes post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes. For Maven 2.0.5 and above.
test run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed.
prepare-package perform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package. (Maven 2.1 and above)
package take the compiled code and package it in its distributable format, such as a JAR.
pre-integration-test perform actions required before integration tests are executed. This may involve things such as setting up the required environment.
integration-test process and deploy the package if necessary into an environment where integration tests can be run.
post-integration-test perform actions required after integration tests have been executed. This may including cleaning up the environment.
verify run any checks to verify the package is valid and meets quality criteria.
install install the package into the local repository, for use as a dependency in other projects locally.
deploy done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

Site Lifecycle

Phase Description
pre-site execute processes needed prior to the actual project site generation
site generate the project's site documentation
post-site execute processes needed to finalize the site generation, and to prepare for site deployment
site-deploy deploy the generated site documentation to the specified web server

插件目标与生命周期的绑定

插件目标是与生命周期的某个阶段绑定的,比如maven-clean-plugin的clean目标与clean阶段绑定,也就意味着当maven执行clean生命周期时,到达clean阶段的时候,会调用maven-clean-plugin的clean目标(删除项目输出目录)。

也就是说,插件目标的执行顺序是由其绑定到的生命周期阶段的顺序决定的,如果多个插件目标绑定到同一个阶段,那么先声明的插件会在后声明的插件之前执行。

对于一些核心插件,Maven已经内置默认将一些插件目标绑定到了生命周期阶段,特别是default生命周期,对于不同的打包类型(jar,war,pom等),Maven提供了不同的默认绑定。如下所示:

Clean Lifecycle Bindings

Phase plugin:goal
clean clean:clean

Default Lifecycle Bindings - Packaging ejb / ejb3 / jar / par / rar / war

Phase plugin:goal
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war
install install:install
deploy deploy:deploy

Default Lifecycle Bindings - Packaging ear

Phase plugin:goal
generate-resources ear:generate-application-xml
process-resources resources:resources
package ear:ear
install install:install
deploy deploy:deploy

Default Lifecycle Bindings - Packaging maven-plugin

Phase plugin:goal
generate-resources plugin:descriptor
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar and plugin:addPluginArtifactMetadata
install install:install
deploy deploy:deploy

Default Lifecycle Bindings - Packaging pom

Phase plugin:goal
package
install install:install
deploy deploy:deploy

Site Lifecycle Bindings

Phase plugin:goal
site site:site
site-deploy site:deploy

参考文献

转载请保留原文地址:Maven用户都应该知道的一些事:构建生命周期和插件

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • 生命周期是maven的又一大核心,maven的生命周期是抽象的,而实际行为都是以插件的方式来完成的,下面我将对生命...
    小炼君阅读 1,201评论 0 50
  • Maven聚合模块: 因为Maven是提倡模块化编程的,所以会以多个工程分为多个模块。如果所有的功能、模块都写在一...
    凯哥学堂阅读 752评论 0 4
  • 什么是构建生命周期 Maven的构建过程被分解为构建生命周期、阶段和目标。一个构建周期由一系列的构建阶段组成,每一...
    欧余山南阅读 867评论 0 0
  • 1. Maven 构建生命周期 Maven 构建生命周期就是 Maven 将一个整体任务划分为一个个的阶段,类似于...
    data4阅读 30,977评论 3 35
  • 感觉是水逆了 最近日子难过的一批 会突然的流泪 突然的心塞 突然的难受 自己都没想过会这么敏感脆弱 我是个经常自我...
    拥彼阅读 252评论 0 0