天天看点

Maven实战之生命周期和插件

生命周期

说到生命周期,我们了解的有项目开发生命周期,那么Maven的生命周期包括什么?有清理、初始化、编译、测试、打包、集成测试、部署等基本上所有的构建步骤。也就是说,几乎所有的项目的构建,都能够映射到这样一个生命周期上。

在Maven世界中,所有任务的完成都是依赖于插件的,生命周期各个阶段也是。

模板方法模式在父类中定义算法的整体结构,子类可以通过实现或者重写父类方法来控制实际的行为,这样既保证了算法有足够的可扩展性,又严格控制算法的整体结构。

package com.company.template.method;
 
publicabstract class AbstractBuild
{
public void build()
{
   initialize(); //初始化
   compile();//编译
   test();//测试
   package();//打包
   integrationTest();//集成测试
   depoly();//部署
 
}
   protected abstract void initialize();
   protected abstract void compile());    
   protected abstract void test();
   protected abstract void package();
   protected abstract void integrationTest();
   protected abstract void depoly();
}
           

Build()方法定义了整个构建过程,初始化、编译、测试、打包、集成测试、部署,里面具体实现由子类实现。

插件机制就列斯月上面这种,在每个构建步骤上都绑定了一个或多个插件行为。

Maven实战之生命周期和插件

生命周期详情

我们构建使用过Maven命令mvn clean install、mvnclean deploy,这个在生命周期是什么作用?

Maven拥有三套相互独立的生命周期,分别是clean(清理项目)、default(构建项目)、site(建立项目站点),三个周期每个周期都包含一些阶段,这些阶段是有顺序的,后面依赖前面。

Clean生命周期示意图

Maven实战之生命周期和插件

pre-clean:执行清理前需要做的工作;

clean:清理上一次的文件;

post-clean:执行一些清理后需要完成的工作;

Default生命周期

default生周期是真正构建时需要执行的步骤,是所有生命周期中最核心的部分。

示意图类似clean生命周期,执行也有顺序性。

validate、initialize、generate-sources、process-sources、generate-resources、process-resources、complie(编译)、process-classes、generate-test-sources、process-test-sources、generate-test-resources、process-test-resources、test-compile、process-test-classes、package、pre-integration-test、integration-test、post-integration-test、verify、install、deploy

其实很多阶段就是字面上的意思,不做过多解释。

site生命周期

包括pre-site、site、post-site、site-depoly阶段,主要目的是建立和发布项目站点,maven能够基于POM包含的信息,自动生成一个友好的站点,方便团队交流发布项目信息。

我们来看看一开始的mvn clean install命令,用户执行这个是用了两个互不干扰的生命周期,也就是clean和default相互独立,clean是执行了pre-clean、clean阶段,install是执行前面所有从validate到install所有的阶段,所以执行完install,包括初始化、编译、测试、打包、安装到本地仓库,这些阶段都完成了,不需要用户手动进行。

插件绑定

Maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体来说,就是生命周期的阶段与插件的目标相互绑定。例如default生命周期的compile这一阶段,就是compile与maven-compiler-plugin插件的compile目标绑定。

插播一下什么是插件的目标。

为了能够提高代码复用,一个插件往往可以完成很多任务,也就有很多目标,例如maven-dependency-plugin插件的分析、依赖树等等,目标就是dependency:analyze、dependency:tree、dependency:list。冒号前面是插件前缀,后面是插件目标。

Maven实战之生命周期和插件

一般我们用到的绑定都是内置的绑定,有兴趣的可以了解一下自定义绑定,根据业务功能需要,绑定不同的插件来完成,比如你自己写了一个插件,就会用到自定义绑定。

插件使用

通过Maven-help-plugin可以了解所有的插件信息。

在命令行使用mvn dependency:tree

从dependency前缀中就能够找到插件maven-dependency-plugin的artifactId,加上groupId和version能够精确定位到这个插件,列出项目的依赖树,帮助分析依赖来源。