Maven生周期(clean+site+default)

11个月前 (04-27)
在 Maven 出现之前,项目构建的生周期就已经存在,开发人员每天都在对项目进行清理,编译,测试及部署,但由于没有统一的规范,不同公司甚不同项目之间的构建的方式都不尽相同。

Maven 从大量项目和构建工具中学习和反思,总结了一套高度的,易扩展的生周期。这个生周期将项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建过程进行了抽象和统一。

生周期与插件的关系

Maven 生周期是抽象的,其本身不能做任何实际工作,这些实际工作(如源代码编译)都通过调用 Maven 插件 中的插件目标(plugin goal)完成的。

为了更好的理解 Maven 生周期、插件以及插件目标三者的关系,我们可以将 Maven 生周期理解成一个抽象父类,将插件理解成其子类,将插件目标理解成子类中重写的方法,其基本结构与下面的示例代码相似。

package net.biancheng.www;

/**

* 模拟 maven 生周期

*/

public abstract class LifeCycle {

//定义构建过程

public void build() {

//模拟生周期各个阶段,即调用插件中目标

clean();

initialize();

compile();

packager();

install();

}

//定义清理的过程

public abstract void clean();

//定义初始化的过程

public abstract void initialize();

//定义编译的过程

public abstract void compile();

//定义打包的过程

public abstract void packager();

//定义安装的过程

public abstract void install();

}


模拟 clean 插件的子类,代码如下。

package net.biancheng.www;

/**

* 子类模拟clean 相关的插件

*/

public abstract class CleanPlugin extends LifeCycle {

//重写父类(生周期)的清理工作

//模拟插件目标

@Override

public void clean() {

System.out.println("清理");

}

}

 
以上示例中,父类 LifeCycle 模拟的是 Maven 生周期,子类 CleanPlugin 模拟的是 Maven 插件,而子类中重写的 clean() 模拟的是插件目标。

虽然示例中的代码与 Maven 实际代码相去甚远,但它们的基本理念是方法相同的。生周期抽象了构建的各个步骤,定义了它们的执行顺序,但却没有提供具体的实现。插件中完成了对构建过程的实现,想要完成某个构建步骤,调用插件中的一个或多个插件目标即可。

生周期中的每个构建过程都可以绑定一个或多个插件目标,且 Maven 为大多数的构建步骤都绑定了默认的插件。例如,针对源代码编译的插件是 maven-compiler-plugin、针对集成测试的插件是 maven-surefire-plugin 等。

注意:Maven 插件和插件目标了解即可,在本教程后面的章节 Maven 插件中会详细介绍。

三套生周期

Maven 拥有三套标准的生周期:

  • 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 三个阶段都会执行。

通过将阶段名传递给 mvn 令,就可以调用构建阶段,例如:

mvn install

生周期的独立性

与构建阶段的前后依赖关系不同,三套生周期本身是相互独立的,用户可以只调用 clean 生周期的某个阶段,也可以只调用 default 生周期的某个阶段,而不会对其他生周期造成任何影响。 

clean 生周期

 clean 生周期包括以下 3 个阶段。

  • pre-clean(清理前)

  • clean(清理)

  • post-clean(清理后)


我们可以通过在 clean 生周期的各个阶段定义目标来修改这部分的操作行为。

示例 1

下面我们将 maven-antrun-plugin 插件的 run 目标绑定到 pre-clean、clean 和 post-clean 三个阶段中,以实现在 clean 生周期的各个阶段中显示自定义文本信息,pom.xml 配置如下:

<project xmlns="http://maven.apache网站站点" rel="nofollow" />

[INFO] Scanning for projects...

[INFO]

[INFO] ----------------------< net.biancheng.www:maven >-----------------------

[INFO] Building maven 0.0.1-SNAPSHOT

[INFO] --------------------------------[ jar ]---------------------------------

[INFO]

[INFO] --- maven-antrun-plugin:1.1:run (www.biancheng网站站点" rel="nofollow" />

<project xmlns="http://maven.apache网站站点" rel="nofollow" />

[INFO] Scanning for projects...

[INFO]

[INFO] ----------------------< net.biancheng.www:maven >-----------------------

[INFO] Building maven 0.0.1-SNAPSHOT

[INFO] --------------------------------[ jar ]---------------------------------

[INFO]

[INFO] --- maven-antrun-plugin:1.1:run (www.biancheng网站站点" rel="nofollow" />

<project xmlns="http://maven.apache网站站点" rel="nofollow" />

[INFO] Scanning for projects...

[INFO]

[INFO] ----------------------< net.biancheng.www:maven >-----------------------

[INFO] Building maven 0.0.1-SNAPSHOT

[INFO] --------------------------------[ jar ]---------------------------------

[INFO]

[INFO] --- maven-antrun-plugin:1.3:run (www.bianchengbang网站站点" rel="nofollow" />