Maven实战学习笔记、7.生命周期和插件

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

执行默认生命周期阶段package。Maven的生命周期是抽象的,其实际行为都由插件来完成,如package阶段的任务可能就会由maven-jar-plugin完成。生命周期和插件

两者协同工作,密不可分,本章对它们进行深入介绍。

7.1 何为生命周期

     在Maven出现之前,项目构建的生命周期就已经存在,软件开发人员每天都在对项目进行清理、编译、测试及部署、虽然大家都在不停地做构建工作,但公司和公司
间、项目和项目间、往往使用不同的方式做类似的工作。有的项目以手工的方式在执行编译测试,有的项目写了自动化脚本执行编译测试。可以想象的是,虽然各种手
工方式十分雷士,但不可能完全一样;同样地,对于自动化脚本,大家也是各写各的,能满足自身需求即可,换个项目就需要重头再来。
    Maven的生命周期就是为了对所有的构件过程进行抽象和统一。Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完善的,易扩展的生命周期。这个
生命周期包含了项目的清理、初始化、编译、测试、打包、继承测试、验证、部署和站点生成等几乎所有的构建步骤。也就是说,几乎所有项目的构建,都能映射到
这样一个生命周期上。
       Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务(如编译源代码)都交由插件来完成。这种思想和设计
模式中的模板方法非常相似。模板方法时在父类中定义算法的整体结构,子类可以通过实现或者重写父类的方法来控制实际的行为,这样既保证了算法有足够的可扩
展性,又能严格控制算法的整体结构。
public abstract class MavenBuild {
    public  void build(){
    	initialize();
    	compile();
    	test();
    	packagee();
    	integrationTest();
    	deploy();
    }
    
    protected abstract void initialize();
    
    protected abstract void compile();
    
    protected abstract void test();
    
    protected abstract void packagee();
    
    protected abstract void integrationTest();
    
    protected abstract void deploy();
}
   虽然上面的代码的Maven实际的代码相去甚远,Maven的生命周期包含更多的步骤和更复杂的逻辑,但它们的基本概念是相同的。生命周期抽象了构建的各个步骤,定义了
它们的次序,但没有提供具体的实现。那么谁来实现呢,也不能让用户重新写一套实现的代码。Maven必须考虑到这一点,因为它设计了插件机制。每个构建步骤都可以绑定
多个插件行为,Maven为大多数构建步骤编写并绑定了默认插件,例如:针对编译的插件有maven-compiler-plugin,针对测试的插件有maven-surefire-plugin等。虽然在大
多数时间里,用户几乎都不会察觉到插件的存在,但实际上编译是由maven-complier-plugin完成的,而测试是由maven-surefire-plugin完成的,当用户特殊需要的时候,也
可以配置插件定制构件行为,甚至自己编写插件。
   编译-测试-打包-部署。
Maven定义的生命周期和插件机制一方面保证了所有Maven项目一致的构建标准,另一方面又通过默认插件简化和稳定了实际项目的构建,此外,该机制还提供了足够的发展空间,用户可以通过配置现有插件或自行编写插件来自定义构建行为。

7.1 生命周期详解

    到目前为止,本书只是介绍了Maven生命周期背后的指导思想,要想熟练的使用maven,还必须详细了解其生命周期的具体定义和使用方式。

7.1.2 三套生命周期

    初学者往往会以为Maven的生命周期是一个整体,其实不然,Maven拥有三套相互独立的生命周期,它们分别为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会得以顺序执行。
    较之于生命周期阶段的前后依赖关系,三套生命周期本身是相互独立的,用户可以仅仅调用clean生命周期的某个阶段,或者仅仅调用default生命周期的某个阶段,而
不会对其他生命周期产生任何影响。例如,当用户调用clean生命周期的clean阶段的时候,不会触发default生命周期的任何阶段,反之亦然,当用户调用default生命周期
的compile阶段的时候,也不会触发clean生命周期的任何阶段。

7.2.2 clean生命周期

    clean生命周期的目的是清理项目,它包含三个阶段:
1)pre-clean 执行一些清理前需要完成的工作。
2)clean清理上一次构件生成的文件
3)post-clean 执行一些清理后需要完成的工作。

7.2.3 default生命周期

    default生命周期定义了真正构件时所需要执行的所有步骤,它是所有生命周期中最核心的部分,其包含的阶段如下,这里笔者只对重要的阶段进行解释。
validate
initialize
generate-sources
process-sources    处理项目主资源文件。一般来说,是对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。
genrate-resources
process-resources
compile 编译项目的主源码,一般来说,是编译src/main/java 目录的java文件至项目输出的主classpath目录后。
process-classes
generate-test-sources
process-test-sources 处理项目测试资源文件。一般来说,是对src/test/resources/目标的内容进行变量替换等工作后,复制到项目输出的测试classpath目录中。
test-compile 编译项目的测试代码,一般来说,是编译java/test/java 目录下的java文件至项目输出的测试classpath目录中。
process-test-classes
test 使用单元测试框架运行测试,测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如jar。
pre-integration-test
integration-test
post-integration-test
verify
install  将包安装到Maven本地仓库,供本地其他Maven项目使用。
deploy  将最终的包复制到远程仓库,供其他开发人员和Maven项目使用。
    对于上述未加解释的阶段,读者也能够大致重名字中猜测到其用途,若想了解进这些阶段的详细信息,可以参阅官方的解释:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

7.2.4 site生命周期

    site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。
pre-site
site
post-site
site-deploy将生成的项目站点发布到服务器上。

7.2.5 命令行与生命周期

      从命令行执行Maven任务的最主要方式就是调用Maven的生命周期阶段。需要注意的是各个生命周期之间是相互独立的。而一个生命周期阶段
是有前后依赖关系的。下面是常见的Maven命令。
$mvn clean
$mvn test
$mvn clean install 该命令调用clean生命周期的clean阶段和default生命周期的install阶段。
$mvn clean deploy site-deploy:该命令调用clean生命周期的clean阶段、default生命周期的deploy阶段,以及site生命周期的site-deploy阶段。
    由于Maven中主要的生命周期阶段并不多,而常用的Maven命令实际都是基于这些阶段简单组合而成的,因此只对Maven生命周期有一个基本的理解,
读者就可以正面而熟练地使用Maven命令。











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值