• Maven-build lifecycle的中心详解


    https://blog.csdn.net/qq_36907589/article/details/80696388

    Maven是基于一个build lifecycle的中心概念,意味着构建和发布特定项目的过程是明确定义的。
    对于人们构建一个项目,这意味着只需要学会少数命令来构建任意maven项目,然后pom会确保他们会得到他们想要的结果。
    有三种内置的build lifecycle:default,clean,site。default生命周期处理项目的部署,clean生命周期处理项目的清理,site生命周期生成站点文档。

    Build Lifecycle由Phase组成

    每种lifecycle由不同的一组phase组成,一个phase代表lifecycle的一个阶段。
    默认lifecycle执行的phase:

    • validate:验证项目的正确性以及包含所有必要的信息
    • compile:编译源码
    • test:编译和运行测试代码
    • package:把编译好的源码打成包,如jar
    • integration-test
    • verify
    • install:把项目安装到本地仓库中去,作为本地其他项目的依赖
    • deploy:把最终的包拷贝到远程仓库上和其他开发者和项目分享

    这些phase(包括没有列出来的phase)会被顺序地执行来完成default lifecycle。以上面的phase为例,这意味着当使用默认的lifecycle时,Maven会首先验证项目,然后尝试编译源码,运行测试,把二进制代码打包(如jar包),对这些包运行集成测试,验证集成测试,安装验证完的包到本地仓库去,然后把安装完的包部署到远程仓库。

    Build Phase由Plugin Goal组成

    尽管一个phase负责lifecycle的一个阶段,但执行这些阶段的方式可能会不同,这是通过把plugin goals绑定到phase上完成的。
    一个goal代表着一个特定的任务(比phase粒度要细)用于构建和管理一个项目。goal可以绑定到0个到多个phase上,没有绑定到phase上的goal可以在lifecycle外直接使用(如使用命令行)。goal的执行顺序取决于其被调用的顺序。 例如下面命令:

    mvn clean dependency:copy-dependencies package
    • 1
    • 1

    上面命令中,clean phase会首先被执行,然后执行dependency:copy-dependencies goal,最后执行package phase。
    一个phase也可以有0个或多个绑定的goal,如果没有goal绑定到它身上,它将不会被执行,如果有多个goal绑定,则会执行所有绑定的goal。

    一些Phase通常不会从命令行直接调用

    名字中带有连字符的phase(如pre-,post-)通常不会从命令行直接调用。这些phase处理中间结果,通常不会在build lifecycle外执行。例如,直接调用integration-test,可能会出现异常。
    代码覆盖工具如Jacoco 以及容器插件如Tomcat会绑定goal到pre-integration-test phase上来准备集成测试的容器环境,这些插件还会绑定goal到post-integration-test phase来收集代码覆盖数据或销毁测试容器环境。
    失效保护(Failsafe )和代码覆盖插件绑定goal到integration-test和verify phase上,结果就是在verify phase后可以得到测试和代码覆盖的报告。如果integration-test从命令行调用,不会有报告产生,更糟糕的情况是集成测试的环境可能停留在挂起的状态。

    设置项目使用的Build Lifecycle

    build lifecycle使用起来很简单,但在maven项目构建时,我们怎么给每个phase指定任务呢?

    Packaging

    首先我们可以通过packaging元素设置项目的打包方式来指定任务,maven支持的打包方式有:jar, war, ear 和 pom。如果不指定,默认为jar。
    每种打包方式都包含了一系列的goal绑定到特定的phase上,例如,jar的打包方式会绑定下面的goal到default lifecycle的phase上:

    • process-resources —— resources:resources
    • compile —— compiler:compile
    • process-test-resources —— resources:testResources
    • test-compile —— compiler:testCompile
    • test —— surefire:test
    • package —— jar:jar
    • install —— install:install
    • deploy —— deploy:deploy

    如上所示几乎是标准的绑定,但一些打包方式会有所不同。例如,pom打包方式只给install和deploy phase绑定goal。完整的绑定列表可以参考Lifecycle Reference

    Plugin

    第二中添加goal到phase上的方式是配置项目中的插件。插件是给Maven提供goal的artifact。另外,一个插件可能会有一个或多个goal,每个goal代表了这个插件的一种能力。例如Compiler插件有两个goal:compile和testCompile,前面一个用来编译main下的源码,后面一个用来编译test源码。
    插件可以把goal绑定到指定的phase上,要注意,把插件本身添加进来还不够,必须指定哪些goal要作为我们构建项目的一部分。
    如果有多个goal绑定到一个phase上,会先执行本来的goal,再执行pom中绑定到phase上的goal,也可以在executions标签上指定goal的执行顺。

  • 相关阅读:
    Luogu P2480 [SDOI2010]古代猪文 卢卡斯+组合+CRT
    luogu 3806 【模板】点分治
    poj 1741 Tree(树的点分治)
    置换群(本蒟蒻瞎BB的)(未完)
    uva 1153 顾客是上帝(贪心)
    关于区间的贪心问题
    uva 1615 高速公路(贪心,区间问题)
    uva 1614奇怪的股市(归纳法证明,贪心)
    uva11491 奖品的价值(贪心)
    uva12545 比特变换器(贪心)
  • 原文地址:https://www.cnblogs.com/ruiati/p/14143307.html
Copyright © 2020-2023  润新知