在 Maven 出现之前,项目构建的生命周期就已经存在,开发人员每天都在对项目进行清理,编译,测试及部署,但由于没有统一的规范,不同公司甚至不同项目之间的构建的方式都不尽相同。
Maven 从大量项目和构建工具中学习和反思,最后总结了一套高度完美的,易扩展的生命周期。这个生命周期将项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建过程进行了抽象和统一。
生命周期与插件的关系
Maven 生命周期是抽象的,其本身不能做任何实际工作,这些实际工作(如源代码编译)都通过调用 Maven 插件 中的插件目标(plugin goal)完成的。
为了更好的理解 Maven 生命周期、插件以及插件目标三者的关系,我们可以将 Maven 生命周期理解成一个抽象父类,将插件理解成其子类,将插件目标理解成子类中重写的方法,其基本结构与下面的示例代码相似。
- package net.jhelp.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.jhelp.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 命令,就可以调用构建阶段,例如:
生命周期的独立性
与构建阶段的前后依赖关系不同,三套生命周期本身是相互独立的,用户可以只调用 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.jhelp.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.jhelp.net pre-clean</id>
- <!--阶段 -->
- <phase>pre-clean</phase>
- <!--目标 -->
- <goals>
- <goal>run</goal>
- </goals>
- <!--配置 -->
- <configuration>
- <!-- 执行的任务 -->
- <tasks>
- <!-- 输出自定义文本信息 -->
- <echo>预清理阶段,欢迎您的到来,网址:www.jhelp.net</echo>
- </tasks>
- </configuration>
- </execution>
- <execution>
- <!--自定义阶段 id -->
- <id>www.jhelp.net clean</id>
- <!--阶段 -->
- <phase>clean</phase>
- <!--目标 -->
- <goals>
- <goal>run</goal>
- </goals>
- <!--配置 -->
- <configuration>
- <!-- 执行的任务 -->
- <tasks>
- <!--自定义文本信息 -->
- <echo>清理阶段,欢迎您的到来,网址:www.jhelp.net</echo>
- </tasks>
- </configuration>
- </execution>
- <execution>
- <!--自定义阶段 id -->
- <id>www.jhelp.net post-clean</id>
- <!--阶段 -->
- <phase>post-clean</phase>
- <!-- 目标 -->
- <goals>
- <goal>run</goal>
- </goals>
- <!--配置 -->
- <configuration>
- <!-- 执行的任务 -->
- <tasks>
- <!-- 执行的任务 -->
- <echo>后清理阶段,欢迎您的到来,网址:www.jhelp.net</echo>
- </tasks>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </project>
打开命令行窗口,跳转到 pom.xml 所在的目录,执行命令mvn post-clean
,结果如下。
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.jhelp.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.jhelp.net validate</id>
- <phase>validate</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <tasks>
- <echo>欢迎您的到来,网址:www.jhelp.net 验证阶段……</echo>
- </tasks>
- </configuration>
- </execution>
- <execution>
- <id>www.jhelp.net compile</id>
- <phase>compile</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <tasks>
- <echo>欢迎您的到来,网址:www.jhelp.net 编译阶段……</echo>
- </tasks>
- </configuration>
- </execution>
- <execution>
- <id>www.jhelp.net test</id>
- <phase>test</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <tasks>
- <echo>欢迎您的到来,网址:www.jhelp.net 测试阶段……</echo>
- </tasks>
- </configuration>
- </execution>
- <execution>
- <id>www.jhelp.net package</id>
- <phase>package</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <tasks>
- <echo>欢迎您的到来,网址:www.jhelp.net 打包阶段……</echo>
- </tasks>
- </configuration>
- </execution>
- <execution>
- <id>www.jhelp.net deploy</id>
- <phase>deploy</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <tasks>
- <echo>欢迎您的到来,网址:www.jhelp.net 部署阶段……</echo>
- </tasks>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </project>
打开命令行窗口,跳转到 pom.xml 所在的目录,执行命令:D:\maven>mvn compile
,结果如下。
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.jhelp.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.jhelp.net pre-site</id>
- <phase>pre-site</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <tasks>
- <echo>欢迎您的到来,网址:www.jhelp.net pre-site 阶段……</echo>
- </tasks>
- </configuration>
- </execution>
- <execution>
- <id>www.jhelp.net site</id>
- <phase>site</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <tasks>
- <echo>欢迎您的到来,网址:www.jhelp.net site 阶段……</echo>
- </tasks>
- </configuration>
- </execution>
- <execution>
- <id>www.jhelp.net post-site</id>
- <phase>post-site</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <tasks>
- <echo>欢迎您的到来,网址:www.jhelp.net post-site 阶段……</echo>
- </tasks>
- </configuration>
- </execution>
- <execution>
- <id>www.jhelp.net site-deploy</id>
- <phase>site-deploy</phase>
- <goals>
- <goal>run</goal>
- </goals>
- <configuration>
- <tasks>
- <echo>欢迎您的到来,网址:www.jhelp.net site-deploy 阶段……</echo>
- </tasks>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </project>
打开命令行窗口,跳转到 pom.xml 所在的目录,执行 mvn 命令:mvn post-site
,结果如下。
本站推荐
-
479
-
445
-
407
-
405
-
395