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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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