6 详解Maven命令执行的内部流程

要知道Maven命令执行的内部流程,首先要了解Maven生命周期

1 生命周期简介

Maven有三套相互独立的生命周期,分别是:

  • Clean Lifecycle(Clean生命周期) :构建之前进行清理工作
  • Default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等
  • Site Lifecycle :生成项目报告,站点,发布站点

三套生命周期,即可单独调用,也可组合调用

2 生命周期阶段(Phase)

2.1 每套生命周期都由一组阶段(Phase)组成

2.2 Clean生命周期的3个阶段

阶段 描述
pre-clean 执行需要在clean之前完成的工作
clean 移除所有上一次构建生成的文件
post-clean 执行需要在clean之后完成的工作

mvn clean 命令中的clean就是在执行clean阶段

2.3 Site生命周期的4个阶段

阶段 描述
pre-site 执行需要在生成站点文档之前完成的工作
clean 生成项目站点文档
post-site 执行需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy 将生成的站点文档部署到指定服务器

2.4 Default生命周期的23个阶段:

生命周期阶段 描述
validate 验证项目是否正确,且所有必要信息可用于完成构建过程
initialize 建立初始化状态,例如:设置属性,创建目录
generate-sources 自动生成一些源代码,然后包含在项目代码中一起编译
process-sources 处理源代码,例如:源码中占位符替换
generate-resources 生成资源文件,例如:配置文件中占位符替换
process-resources 将资源文件拷贝到目标目录,准备打包阶段
compile 编译该项目的源代码
process-classes 从编译生成的文件提交处理,例如:Java类的字节码增强/优化
generate-test-sources 自动化生成测试代码
process-test-sources 处理测试代码,比如过滤一些占位符
generate-test-resources 生成测试用的资源文件
process-test-resources 拷贝测试用的资源文件到目标目录
test-compile 编译测试源代码到测试目标目录
process-test-classes 处理测试代码文件编译生成的文件
test 运行测试使用合适的单元测试框架(JUnit)
prepare-package 在打包之前进行准备工作,例如:处理package的版本号
package 将代码进行打包,比如jar包
pre-integration-test 完成执行集成测试之前所需操作。例如,设置所需的环境
integration-test 将package部署到一个环境中以运行集成测试
pre-integration-test 完成集成测试已全部执行后所需操作。例如,清理环境
verify 运行任何检查,验证包是有效的,符合质量审核规定
install 将包安装到本地存储库,它可以用作当地其他项目的依赖
deploy 复制最终的包到远程仓库与其他开发者和项目共享

2.5 阶段特点

  • 运行某个阶段时,它之前的所有阶段都会被运行
    mvn clean 等同于 mvn pre-clean clean
    mvn post-clean 等同于 mvn pre-clean clean post-clean

3 plugin与goal

3.1 plugin相当于一系列goal集合(个人见解)

3.2 goal

  • maven运行某阶段(phase),其实就是在运行绑定在该阶段(phase)上的一些plugin goal

  • goal可以绑定到任意个phase中,一个phase有一个或多个goal,goal也是按顺序执行的,一个phase被执行时,绑定到phase里的goal会按绑定的时间被顺序执行,不管phase己经绑定了多少个goal,你自己定义的goal都可以继续绑到phase中

  • 一个未绑定goal的phase是没有任何意义的

例
    clean phase默认绑定clean:clean
    clean(plugin):clean(goal)

    maven clean 就是 执行clean(plugin)的clean(goal)
  • 也可直接执行插件的goal
例
    mvn clean:clean 
    就是直接执行clean插件的clean(goal)

3.3 如何配置plugin

  • 插件可自由绑定在任意阶段

  • 此处以生成源码jar的插件配置

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1.1</version>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
  • 根据配置可以看出,将生成源码jar的goal绑定在verify阶段上,此时只需运行mvn verify即可生成源码jar

  • 如果在命令中执行插件,使用-Dkey=value可进行插件设置

mvn install -Dmaven.test.skip=true
就是在执行install时,跳过test
<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>

4 图解Maven命令执行过程

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

推荐阅读更多精彩内容

  • 什么是生命周期?在Maven出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理、编译、测试...
    yust5273阅读 253评论 0 0
  • Build Lifecycle 生命周期 Maven是基于build生命周期的核心概念,这意味着build和di...
    亼珏阅读 443评论 0 0
  • 何为生命周期 在 Maven 出现之前,项目构建的生命周期就已经存在。软件开发人员每天都在对项目进行清理、编译、测...
    杰哥长得帅阅读 273评论 0 2
  • Maven 生命周期 Maven 生命周期是为了对所有的构建过程进行抽象和统一,开发了一套高度完善的、易扩展的生命...
    聪明的奇瑞阅读 512评论 0 1
  • 概述Maven出现以前,项目构建的生命周期就已经存在了。软件开发人员每天都在对项目进行清理、编译、测试及部署,而且...
    SonyaBaby阅读 929评论 0 0