美文网首页
6 详解Maven命令执行的内部流程

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

作者: 笑Skr人啊 | 来源:发表于2020-03-20 16:54 被阅读0次

    要知道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

    相关文章

      网友评论

          本文标题:6 详解Maven命令执行的内部流程

          本文链接:https://www.haomeiwen.com/subject/kqajyhtx.html