Maven项目管理工具:Maven生命周期(clean+site+default)

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

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

生命周期与插件的关系

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

为了更好的理解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();
}12345678910111213141516171819202122232425复制代码类型:[java]

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

package net.biancheng.www;/**
* 子类模拟clean 相关的插件
*/public abstract class CleanPlugin extends LifeCycle { //重写父类(生命周期)的清理工作
 //模拟插件目标
 @Override
 public void clean() {
  System.out.println("清理");
 }
}123456789101112复制代码类型:[java]

以上示例中,父类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 install1复制代码类型:[java]

生命周期的独立性

与构建阶段的前后依赖关系不同,三套生命周期本身时相互独立的,用户可以只调用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.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>net.biancheng.www</groupId>
 <artifactId>maven</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <dependencies>
  <!-- junit依赖 -->
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.9</version>
   <scope>compile</scope>
  </dependency>
  <!-- log4j依赖 -->
  <dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.17</version>
  </dependency>
 </dependencies>
 <build>
  <plugins>
   <!-- 添加插件 maven-antrun-plugin -->
   <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-antrun-plugin</artifactId>
 <version>1.1</version>
 <executions>
  <execution>
   <!--自定义阶段 id -->
   <id>www.biancheng.net pre-clean</id>
   <!--阶段 -->
   <phase>pre-clean</phase>
   <!--目标 -->
   <goals>
    <goal>run</goal>
   </goals>
   <!--配置 -->
   <configuration>
    <!-- 执行的任务 -->
    <tasks>
  <!-- 输出自定义文本信息 -->
  <echo>预清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net</echo>
    </tasks>
   </configuration>
  </execution>
  <execution>
   <!--自定义阶段 id -->
   <id>www.biancheng.net clean</id>
   <!--阶段 -->
   <phase>clean</phase>
   <!--目标 -->
   <goals>
    <goal>run</goal>
   </goals>
   <!--配置 -->
   <configuration>
    <!-- 执行的任务 -->
    <tasks>
  <!--自定义文本信息 -->
  <echo>清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net</echo>
    </tasks>
   </configuration>
  </execution>
  <execution>
   <!--自定义阶段 id -->
   <id>www.biancheng.net post-clean</id>
   <!--阶段 -->
   <phase>post-clean</phase>
   <!-- 目标 -->
   <goals>
    <goal>run</goal>
   </goals>
   <!--配置 -->
   <configuration>
    <!-- 执行的任务 -->
    <tasks>
  <!-- 执行的任务 -->
  <echo>后清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net</echo>
    </tasks>
   </configuration>
  </execution>
 </executions>
   </plugin>
  </plugins>
 </build>
</project>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889复制代码类型:[java]

打开命令行窗口,跳转到pom.xml所在的目录,执行命令mvnpost-clean,结果如下。

[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.net pre-clean) @ maven ---
[INFO] Executing tasks
  [echo] 预清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
[INFO] Executed tasks
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven ---
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (www.biancheng.net clean) @ maven ---
[INFO] Executing tasks
  [echo] 清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
[INFO] Executed tasks
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (www.biancheng.net post-clean) @ maven ---
[INFO] Executing tasks
  [echo] 后清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.365 s
[INFO] Finished at: 2021-03-01T13:25:07+08:00[INFO] ------------------------------------------------------------------------12345678910111213141516171819202122232425262728复制代码类型:[java]

default生命周期

default生命周期定义了项目真正构建时所需要的所有步骤,它是所有生命周期中最核心,最重要的部分。

default生命周期包含非常多的阶段,如下表。

阶段 描述
validate 验证项目是否正确以及所有必要信息是否可用。
initialize 初始化构建状态。
generate-sources 生成编译阶段需要的所有源码文件。
process-sources 处理源码文件,例如过滤某些值。
generate-resources 生成项目打包阶段需要的资源文件。
process-resources 处理资源文件,并复制到输出目录,为打包阶段做准备。
compile 编译源代码,并移动到输出目录。
process-classes 处理编译生成的字节码文件
generate-test-sources 生成编译阶段需要的测试源代码。
process-test-sources 处理测试资源,并复制到测试输出目录。
test-compile 编译测试源代码并移动到测试输出目录中。
test 使用适当的单元测试框架(例如 JUnit)运行测试。
prepare-package 在真正打包之前,执行一些必要的操作。
package 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。
pre-integration-test 在集成测试执行之前,执行所需的操作,例如设置环境变量。
integration-test 处理和部署所需的包到集成测试能够运行的环境中。
post-integration-test 在集成测试被执行后执行必要的操作,例如清理环境。
verify 对集成测试的结果进行检查,以保证质量达标。
install 安装打包的项目到本地仓库,以供其他项目使用。
deploy 拷贝最终的包文件到远程仓库中,以共享给其他开发人员和项目。

示例2

将maven-antrun-plugin插件的run目标绑定default生命周期的部分阶段中,以实现在default生命周期的特定阶段中显示定义文本信息。

更新D:\maven文件夹中的pom.xml文件,内容如下。

<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>net.biancheng.www</groupId>
 <artifactId>maven</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <dependencies>
  <!-- junit依赖 -->
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.9</version>
   <scope>compile</scope>
  </dependency>
  <!-- log4j依赖 -->
  <dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.17</version>
  </dependency>
 </dependencies>
 <build>
  <plugins>
   <!-- 添加插件 maven-antrun-plugin -->
   <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-antrun-plugin</artifactId>
 <version>1.1</version>
 <executions>
  <execution>
   <id>www.biancheng.net validate</id>
   <phase>validate</phase>
   <goals>
    <goal>run</goal>
   </goals>
   <configuration>
    <tasks>
  <echo>编程帮 欢迎您的到来,网址:www.biancheng.net 验证阶段……</echo>
    </tasks>
   </configuration>
  </execution>
  <execution>
   <id>www.biancheng.net compile</id>
   <phase>compile</phase>
   <goals>
    <goal>run</goal>
   </goals>
   <configuration>
    <tasks>
  <echo>编程帮 欢迎您的到来,网址:www.biancheng.net 编译阶段……</echo>
    </tasks>
   </configuration>
  </execution>
  <execution>
   <id>www.biancheng.net test</id>
   <phase>test</phase>
   <goals>
    <goal>run</goal>
   </goals>
   <configuration>
    <tasks>
  <echo>编程帮 欢迎您的到来,网址:www.biancheng.net 测试阶段……</echo>
    </tasks>
   </configuration>
  </execution>
  <execution>
   <id>www.biancheng.net package</id>
   <phase>package</phase>
   <goals>
    <goal>run</goal>
   </goals>
   <configuration>
    <tasks>
  <echo>编程帮 欢迎您的到来,网址:www.biancheng.net 打包阶段……</echo>
    </tasks>
   </configuration>
  </execution>
  <execution>
   <id>www.biancheng.net deploy</id>
   <phase>deploy</phase>
   <goals>
    <goal>run</goal>
   </goals>
   <configuration>
    <tasks>
  <echo>编程帮 欢迎您的到来,网址:www.biancheng.net 部署阶段……</echo>
    </tasks>
   </configuration>
  </execution>
 </executions>
   </plugin>
  </plugins>
 </build>
</project>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495复制代码类型:[java]

打开命令行窗口,跳转到pom.xml所在的目录,执行命令:D:\maven>mvncompile,结果如下。

[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.net validate) @ maven ---
[INFO] Executing tasks
  [echo] 编程帮 欢迎您的到来,网址:www.biancheng.net 验证阶段……
[INFO] Executed tasks
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\maven\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (www.biancheng.net compile) @ maven ---
[INFO] Executing tasks
  [echo] 编程帮 欢迎您的到来,网址:www.biancheng.net 编译阶段……
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.652 s
[INFO] Finished at: 2021-03-01T15:07:50+08:00
[INFO] ------------------------------------------------------------------------12345678910111213141516171819202122232425262728复制代码类型:[java]

site生命周期

sit生命周期的目的是建立和部署项目站点,Maven能够根据POM包含的信息,自动生成一个友好的站点,该站点包含一些与该项目相关的文档。

site生命周期包含以下4个阶段:

pre-site

site

post-site

site-deploy

下面我们将maven-antrun-plugin插件的run目标绑定到site生命周期的所有阶段中,以实现在该生命周期各个阶段显示自定义文本信息。

更新D:\maven目录下的pom.xml文件,内容如下。

<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>net.biancheng.www</groupId>
 <artifactId>maven</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <dependencies>
  <!-- junit依赖 -->
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.9</version>
   <scope>compile</scope>
  </dependency>
  <!-- log4j依赖 -->
  <dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.17</version>
  </dependency>
 </dependencies>
 <build>
  <plugins>
   <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-site-plugin</artifactId>
 <version>3.7.1</version>
   </plugin>
   <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-project-info-reports-plugin</artifactId>
 <version>3.0.0</version>
   </plugin>
   <!-- 添加插件 maven-antrun-plugin -->
   <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-antrun-plugin</artifactId>
 <version>1.3</version>
 <executions>
  <execution>
   <id>www.bianchengbang.net pre-site</id>
   <phase>pre-site</phase>
   <goals>
    <goal>run</goal>
   </goals>
   <configuration>
    <tasks>
  <echo>编程帮 欢迎您的到来,网址:www.biancheng.net pre-site 阶段……</echo>
    </tasks>
   </configuration>
  </execution>
  <execution>
   <id>www.bianchengbang.net site</id>
   <phase>site</phase>
   <goals>
    <goal>run</goal>
   </goals>
   <configuration>
    <tasks>
  <echo>编程帮 欢迎您的到来,网址:www.biancheng.net site 阶段……</echo>
    </tasks>
   </configuration>
  </execution>
  <execution>
   <id>www.bianchengbang.net post-site</id>
   <phase>post-site</phase>
   <goals>
    <goal>run</goal>
   </goals>
   <configuration>
    <tasks>
  <echo>编程帮 欢迎您的到来,网址:www.biancheng.net post-site 阶段……</echo>
    </tasks>
   </configuration>
  </execution>
  <execution>
   <id>www.bianchengbang.net site-deploy</id>
   <phase>site-deploy</phase>
   <goals>
    <goal>run</goal>
   </goals>
   <configuration>
    <tasks>
  <echo>编程帮 欢迎您的到来,网址:www.biancheng.net site-deploy 阶段……</echo>
    </tasks>
   </configuration>
  </execution>
 </executions>
   </plugin>
  </plugins>
 </build>
</project>123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293复制代码类型:[java]

打开命令行窗口,跳转到pom.xml所在的目录,执行mvn命令:mvnpost-site,结果如下。

[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.net pre-site) @ maven ---
[INFO] Executing tasks
  [echo] 编程帮 欢迎您的到来,网址:www.biancheng.net pre-site 阶段……
[INFO] Executed tasks
[INFO]
[INFO] --- maven-site-plugin:3.7.1:site (default-site) @ maven ---
[WARNING] Input file encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[INFO] configuring report plugin org.apache.maven.plugins:maven-project-info-reports-plugin:3.0.0[INFO] 15 reports detected for maven-project-info-reports-plugin:3.0.0: ci-management, dependencies, dependency-info, dependency-management, distribution-management, index, issue-management, licenses, mailing-lists, modules, plugin-management, plugins, scm, summary, team
[INFO] Rendering site with default locale English (en)[WARNING] No project URL defined - decoration links will not be relativized!
[INFO] Rendering content with org.apache.maven.skins:maven-default-skin:jar:1.2 skin.
[INFO] Generating "Dependencies" report  --- maven-project-info-reports-plugin:3.0.0:dependencies
[INFO] Generating "Dependency Information" report --- maven-project-info-reports-plugin:3.0.0:dependency-info
[INFO] Generating "About" report   --- maven-project-info-reports-plugin:3.0.0:index
[INFO] Generating "Plugin Management" report --- maven-project-info-reports-plugin:3.0.0:plugin-management
[INFO] Generating "Plugins" report --- maven-project-info-reports-plugin:3.0.0:plugins
[INFO] Generating "Summary" report --- maven-project-info-reports-plugin:3.0.0:summary
[INFO]
[INFO] --- maven-antrun-plugin:1.3:run (www.bianchengbang.net site) @ maven ---
[INFO] Executing tasks
  [echo] 编程帮 欢迎您的到来,网址:www.biancheng.net site 阶段……
[INFO] Executed tasks
[INFO]
[INFO] --- maven-antrun-plugin:1.3:run (www.bianchengbang.net post-site) @ maven ---
[INFO] Executing tasks
  [echo] 编程帮 欢迎您的到来,网址:www.biancheng.net post-site 阶段……
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.824 s
[INFO] Finished at: 2021-03-01T16:02:44+08:00
[INFO] ------------------------------------------------------------------------
(0)

相关推荐