命令行的输入往往就对应了声明周期,Maven的生命周期是抽象的,其实际行为都是由插件来完成。生命周期和插件两者协同工作,密不可分。
一、何为声明周期
    Maven的生命周期就是为了对多有的构建过程进行抽象和统一。总结出了一套高度完善的、易扩展的生命周期。这个生命周期包含项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构件步骤。几乎所有项目的构建,都能映射到这样一个声明周期上。
    Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的世界中,实际的任务都交给插件完成。
    每一个构建步骤都可以绑定一个或者多个插件行为,而且Maven为大多数构建步骤编写并绑定了默认的插件。当 用户有特殊需求的时候,也可以配置插件定制构建行为,甚至自己编写插件。
二、生命周期详解
    2.1 三套生命周期
    分别为:clean、default和site。clean:清理项目;default:构建项目;site:建立项目站点。
    每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。例子:clean生命周期,有pre-clean,clean,post-clean。当调用pre-clean时,只执行pre-clean阶段。当调用clean的时候,执行pre-clean,和clean。如果调用post-clean,则执行pre-clean、clean、post-clean。
    较之于生命周期阶段的前后依赖关系,三套生命周期本身是相互独立的。
    2.2 clean生命周期
    1)pre-clean:执行一些清理前需要完成的工作。
    2)clean:清理上一次构件生成的文件。
    3)post-clean:执行一些清理后需要完成的工作。
    2.3 default生命周期
        default生命周期定义了真正构建时需要执行的所有步骤,它是所有生命周期中最核心的部分,其中包含的阶段如下:
  1. validate
  2. initialize
  3. generate-sources
  4. process-sources:处理项目主资源文件,是对src/main/resources目录的内容进行变量替换工作后,复制到项目输出的主classpath目录中。
  5. generate-resources
  6. process-resources
  7. compile:编译项目的主源码,编译src/main/java目录下的Java文件至项目输出的主classpath目录中。
  8. process-classes
  9. generate-test-sources
  10. process-test-sources:处理项目测试资源文件。对src/test/resources目录的内容进行变量替换等工作之后,复制到项目输出的测试classpath目录中。
  11. generate-test-resources
  12. process-test-resources
  13. test-compile:编译项目的测试代码;编译src/test/java目录下的Java文件至项目输出的测试classpath目录中。
  14. process-test-classes
  15. test:使用单元测试框架运行测试,测试代码不会被打包或部署。
  16. prepare-package
  17. package:接受编译好的代码,打包成可发布的格式,如JAR。
  18. pre-integration-test
  19. integration-test
  20. post-integration-test
  21. verify
  22. install:将包安装到Maven本地仓库,供本地其他Maven项目使用。
  23. deploy:将最终的包复制到远程仓库,供其他开发人员和Maven项目使用。
    2.4 site生命周期
    目的:建立和发布站点信息,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。
    阶段:
    1)pre-site:执行一些在生成项目站点之前需要完成的工作
    2)site:生成项目站点文档
    3)site-deploy:将生成的项目站点发布到服务器上。
    2.5 命令行与生命周期
    1)$mvn clean:该命令调用clean生命周期的clean阶段。
    2)$mvn test:该命令调用default生命周期的test节点。
    3)$mvn clean install:该命令调用clean生命周期的clean阶段和default生命周期的install阶段。经常使用!
    4)$mvn clean deploy site-deploy:执行三个生命周期的三个阶段。
三、插件目标:
    Maven的核心仅仅定义了抽象的生命周期,具体的任务交由插件完成,插件以独立的构件形式存在。
    一个插件有多个目标,每个功能就是一个插件目标,所以一个插件有多个功能。
四、插件绑定
    Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言,是生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。
    4.1 内置绑定
    为了能让用户几乎不用任何配置就能构建Maven项目,Maven在核心为一些主要的生命阶段绑定了多个插件的目标,当用户通过命令调用生命阶段的时候,对应的插件目标就会执行相应的任务。
      
    
    4.2 自定义绑定
    除了内置绑定以外,用户还能够自己选择将某个插件目标绑定到生命周期的某个阶段上。
    例子:创建项目的源码jar包,maven-sources-plugin可以帮助我们完成任务,它的jar-no-fork目标能够将项目的主代码打包成jar文件,可以将其绑定到default生命周期的verify阶段上,在执行完成集成测试后和安装构件之前创建源码jar包。
    插件的配置如下:
    
    配置除了基本的插件坐标声明之外,还有插件执行配置。executions下每个execution子元素可以用来配置执行一个任务。
    <id>:attach-sources任务
    <phase>:绑定到verify声明周期阶段上。    
    <goals>:配置指定要执行的插件目标。
    如果不添加phase元素配置生命周期阶段,插件目标也能绑定到生命周期中,原因:很多插件的目标在编写的时候已经定义了默认绑定阶段。使用maven-help-plugin查看插件详细信息,了解插件目标的默认绑定阶段。
    例子: mvn help:describe-Dplugin =groupId:artifactId:version -Ddetail 
    查看 Bound to phase 查看绑定到那个阶段。
    如果多个目标绑定到同一个阶段,它的执行顺序按照声明顺序执行。
五、插件配置
    完成插件和生命周期的绑定之后,用户还可以配置插件目标的参数,进一步调整插件目标所执行的任务。可以通过命令行和POM配置方式配置这些参数。
    5.1 命令行插件配置
    用户可以在Maven命令中使用-D参数,并伴随一个参数键=参数值的形式,来配置插件目标的参数。
    例子:maven-surefire-plugin提供了一个maven.test.skip参数,当其值为true的时候,就会跳过执行测试。则执行命令如下:
    $mvn install -D maven.test.skip=true
    参数-D是Java自带的,其功能是通过命令行设置一个Java系统属性,Maven简单的重用了该参数,在准备插件的时候检查系统属性,便实现了插件参数的配置。
    5.2 pom中插件全局配置
    有些参数的值从项目创建到项目发布都不会变化,则在POM文件中一次性配置就显然比重复在命令行输入要方便。
    用户可以在声明插件的时候,对插件进行一个全局配置,所有该基于该插件目标的任务,就会使用这些配置。
    例子:配置maven-compiler-plugin编译Java1.8版本的源文件,生成jvm1.8兼容的字节码文件。
    
    5.3 POM中插件任务配置
    可以为某个插件任务配置特定的参数。
    例子:maven-antrun-plugin,有一个目标run,可以用来Maven中调用Ant任务。将maven-antrun-plugin:run绑定到多个生命阶段,再加以不同的配置,就可以让Maven在不同的生命阶段执行不同的任务。
    
    maven-antrun-plugin:run与validate阶段绑定从而构成一个id为ant-validate的任务。
    插件全局配置中的configuration元素位于plugin元素下面,而这里测configuration元素则位于execution元素下,表示这是特定任务的配置,而非插件整体的配置。
六、获取插件信息
    1.从官方网站获取
    2.使用maven-help-plugin描述插件
    mvn help :describe -D plug=groupId:artifactId:version
七、从命令行调用插件
    mvn -h 查看mvn命令帮助。
    
    options:可用选项,mvn命令有20多个选项。
    goals:插件目标。
    phases:生命周期阶段。
    可以通过mvn命令激活生命周期阶段,从而执行那些绑定在生命周期阶段上的插件目标。Maven还支持直接从命令行调用插件目标。原因:某些任务不适合绑定在生命周期上,例如:描述插件——maven-help-plugin:describe。
    使用例子:
    mvn groupId:artifactId:version:goal -Dplugin=compile。
八、插件解析机制
    为了方便用户使用和配置插件,Maven不需要用户提供完整的插件坐标信息,就可以解析到正确的插件。
    本节介绍Maven的运行机制。
    8.1 插件仓库
    与依赖构件一样,先从本地仓库查找插件,如果不存在则下载。
    但是,Maven会区别对依赖的远程仓库和插件的远程仓库。之前介绍的配置远程仓库,只对一般依赖有效果。
    例子:
    
    除了pluginRepositories和pluginRepository之外,其他与之前讲述的构件依赖一直。关闭了snapshot的支持,防止出问题。
    这个可以放在pom中或者settings.xml中。
    8.2 插件的默认groupId
    在pom中配置插件的时候,如果插件是Maven官方插件,groupId可以不用写,会自动默认org.apache.maven.plugins补齐。但是不推荐这样,防止对不熟悉Maven的成员产生疑惑。
    8.3 解析插件版本
    版本也可以不指定,如果不指定,首先Maven在超级POM中为所有核心插件设定了版本,如果不指定版本,则版本就已经确定了。
    如果插件不属于核心插件。则Maven就会检查所有仓库中可用版本,然后做出选择,也是通过groupId/artifactId/maven-metadata.xml选择。不在阐述。
    这也是不推荐的做法,原因你懂得!
    8.4 解析插件前缀
    插件前缀与groupId:artifactId是一一对应,这种匹配关系存储在仓库元数据中(这次不同是groupId/maven-metadata.xml)。
    Maven在解析插件仓库元数据的时候,会使用默认的groupId。可以使用settings.xml配置仓库元数据
    
    例子:当解析到dependency:tree
    首先默认groupId归并所有插件仓库的元数据;然后找到对应的元数据,找到对应的artifactId为maven-dependency-plugin;结合groupId找到version,就找到了完整的坐标了!
    
 
 
 
 
 
 
 
 

5 Maven生命周期和插件的更多相关文章

  1. maven生命周期和插件

    maven生命周期和插件 生命周期 maven的生命周期有三套,互相独立.每个生命周期含有不同阶段,常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作 clean 清理上一次 ...

  2. [maven] 生命周期和插件

    maven生命周期和插件 生命周期 maven的生命周期有三套,互相独立.每个生命周期含有不同阶段,常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作 clean 清理上一次 ...

  3. 05 Maven 生命周期和插件

    Maven 生命周期和插件 除了坐标.依赖以及仓库之外, Maven 另外两个核心概念是生命周期和插件.在有关 Maven 的日常使用中,命令行的输入往往就对应了生命周期,如 mvn package ...

  4. MAVEN学习笔记之Maven生命周期和插件简介(3)

    MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...

  5. Maven系列学习(三)Maven生命周期和插件

    Maven生命周期和插件 Maven另外的两个核心概念就是生命周期和插件,Maven的生命周期都是抽象的,其实实际行为都是由插件来完成的,生命周期和插件两者协同工作 1.生命周期 Maven的生命周期 ...

  6. maven生命周期与插件

    目录 Maven生命周期 clean default site 命令与对应周期 插件与绑定 插件目标 插件绑定 内置绑定 自定义绑定 插件配置 本文主要是针对<maven实战>书中关键知识 ...

  7. (十二)Maven生命周期和插件

    除了坐标.依赖以及仓库之外,Maven的另外两个核心概念是生命周期和插件.在有关Maven的日常使用中,命令行的输入往往就对应了生命周期,如mvn package就表示执行默认生命周期阶段packag ...

  8. Maven生命周期和插件机制

    Maven中的一个非常重要的概念是生命周期和插件,这篇文章重点介绍下Maven的生命周期. Maven的生命周期是抽象的,具体的功能是有具体的插件来完成的,Maven有相当多的功能插件,以至于Mave ...

  9. Maven生命周期(插件)

    maven拥有三套相互独立的生命周期,它们分别是clean,default和site.clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site 生命周期的目的是建立项目站 ...

  10. maven生命周期和插件详解

    生命周期 什么是生命周期? maven的生命周期就是对所有的构建过程进行抽象和统一.maven从大量项目和构建工具中总结了一套高度完善的.易扩展的生命周期.这个生命周期包含项目的清理.初始化.编译.测 ...

随机推荐

  1. java中线程切换的开销

    思路: 开三个线程A,B,C 线程A不断的调用LockSupport.park()阻塞自己,一旦发现自己被唤醒,调用Thread.interrupted()清除interrupt标记位,同时增加自增计 ...

  2. Codechef Black Nodes in Subgraphs(树型背包)

    题目链接 Black Nodes in Subgraphs 题目意思就是在一棵树中所有点标记为两种颜色(黑和白) 然后询问是否存在大小为X恰好有Y个黑点的连通块 这题我们可以用树型背包的方法 设$f[ ...

  3. [AI开发]深度学习如何选择GPU?

    机器推理在深度学习的影响下,准确性越来越高.速度越来越快.深度学习对人工智能行业发展的贡献巨大,这得益于现阶段硬件计算能力的提升.互联网海量训练数据的出现.本篇文章主要介绍深度学习过程中如何选择合适的 ...

  4. Spring实战Day3

    通过XML创建装配bean 1.装配不存在成员变量的bean <bean id="talent" class="cn.jqzhong.Spring.study.da ...

  5. 邁向IT專家成功之路的三十則鐵律 鐵律二十三:IT人的成家之道-樸實

    根據內政部一份2013年最新的調查報告指出台灣人的離婚率位居全球第三,想想看如果這是經濟成長率的排名表現那該有多好.然而究竟為何在台灣這塊小小的土地上,不僅離婚非常高而且晚婚的人也非常的多,其原因肯定 ...

  6. scp 时出现permission denied

    如果scp到 /usr/local/目录下,则无权限,可更改到用户目录下

  7. Opencv 最小外接矩形合并拼接

    前一篇画出了最小外接矩形,但是有时候画出来的矩形由于中间像素干扰或者是其他原因矩形框并不是真正想要的 如图1是一个信号的雨图,被矩形框分割成了多个小框: 需要合并矩形框达到的效果: 主要思想: 扫描两 ...

  8. Why is chkconfig no longer available in Ubuntu?

    Question: I can not use chkconfig tools in Ubuntu 12.10 It's a very useful tools to configure the se ...

  9. uva 11127(暴力)

    题意:给出一个字符串,包含0.1.*,当中×是能够替换成0或者1的,假设字符串的某个子串S有SSS这种连续反复3次出现,不是Triple-free串,问给出的字符串能够形成多少个非Triple-fre ...

  10. python(5)- 简单练习:python三级菜单优化

    python三级菜单优化,菜鸟版链接:http://www.cnblogs.com/xuyaping/p/6648170.html menu = { '北京':{ '海淀':{ '五道口':{ 'so ...