Maven构建生命周期详细介绍
什么是构建生命周期
构建生命周期是一组阶段的序列(sequenceofphases),这些构建生命周期中的每一个由构建阶段的不同列表定义,其中构建阶段表示生命周期中的阶段。
例如,默认(default)的生命周期包括以下阶段(注意:这里是简化的阶段,用于生命周期阶段的完整列表):
验证(validate)-验证项目是否正确,所有必要的信息可用
编译(compile)-编译项目的源代码
测试(test)-使用合适的单元测试框架测试编译的源代码。这些测试不应该要求代码被打包或部署
打包(package)-采用编译的代码,并以其可分配格式(如JAR)进行打包。
验证(verify)-对集成测试的结果执行任何检查,以确保满足质量标准
安装(install)-将软件包安装到本地存储库中,用作本地其他项目的依赖项
部署(deploy)-在构建环境中完成,将最终的包复制到远程存储库以与其他开发人员和项目共享。每个阶段定义了目标被执行的顺序。这里的阶段是生命周期的一部分。
举例说明,一个典型的Maven构建生命周期是由以下几个阶段的序列组成的:
| 阶段 | 处理 | 描述 |
|---|---|---|
| prepare-resources | 资源拷贝 | 本阶段可以自定义需要拷贝的资源 |
| compile | 编译 | 本阶段完成源代码编译 |
| package | 打包 | 本阶段根据pom.xml中描述的打包配置创建JAR/WAR包 |
| install | 安装 | 本阶段在本地/远程仓库中安装工程包 |
当需要在某个特定阶段之前或之后执行目标时,可以使用pre和post来定义这个目标。
当Maven开始构建工程,会按照所定义的阶段序列的顺序执行每个阶段注册的目标。Maven有以下三个标准的生命周期:
clean
default(orbuild)
site
目标表示一个特定的、对构建和管理工程有帮助的任务。它可能绑定了0个或多个构建阶段。没有绑定任何构建阶段的目标可以在构建生命周期之外被直接调用执行。
执行的顺序依赖于目标和构建阶段被调用的顺序。例如,考虑下面的命令。clean和package参数是构建阶段,而dependency:copy-dependencies是一个目标。
mvncleandependency:copy-dependenciespackage
这里的clean阶段将会被首先执行,然后dependency:copy-dependencies目标会被执行,最终package阶段被执行。
Clean生命周期
当我们执行mvnpost-clean命令时,Maven调用clean生命周期,它包含以下阶段。
pre-clean
clean
post-clean
Maven的clean目标(clean:clean)绑定到了clean生命周期的clean阶段。它的clean:clean目标通过删除构建目录删除了构建输出。所以当mvnclean命令执行时,Maven删除了构建目录。
我们可以通过在上面的clean生命周期的任何阶段定义目标来修改这部分的操作行为。
在下面的例子中,我们将maven-antrun-plugin:run目标添加到pre-clean、clean和post-clean阶段中。这样我们可以在clean生命周期的各个阶段显示文本信息。
我们已经在C:\MVN\project目录下创建了一个pom.xml文件。
4.0.0 com.companyname.projectgroup project 1.0 org.apache.maven.plugins maven-antrun-plugin 1.1 id.pre-clean pre-clean run pre-cleanphase id.clean clean run cleanphase id.post-clean post-clean run post-cleanphase
现在打开命令控制台,跳转到pom.xml所在目录,并执行下面的mvn命令。
C:\MVN\project>mvnpost-clean
Maven将会开始处理并显示clean生命周期的所有阶段。
[INFO]Scanningforprojects...
[INFO]------------------------------------------------------------------
[INFO]BuildingUnnamed-com.companyname.projectgroup:project:jar:1.0
[INFO]task-segment:[post-clean]
[INFO]------------------------------------------------------------------
[INFO][antrun:run{execution:id.pre-clean}]
[INFO]Executingtasks
[echo]pre-cleanphase
[INFO]Executedtasks
[INFO][clean:clean{execution:default-clean}]
[INFO][antrun:run{execution:id.clean}]
[INFO]Executingtasks
[echo]cleanphase
[INFO]Executedtasks
[INFO][antrun:run{execution:id.post-clean}]
[INFO]Executingtasks
[echo]post-cleanphase
[INFO]Executedtasks
[INFO]------------------------------------------------------------------
[INFO]BUILDSUCCESSFUL
[INFO]------------------------------------------------------------------
[INFO]Totaltime:<1second
[INFO]Finishedat:SatJul0713:38:59IST2012
[INFO]FinalMemory:4M/44M
[INFO]------------------------------------------------------------------
你可以尝试修改mvnclean命令,来显示pre-clean和clean,而在post-clean阶段不执行任何操作。
Default(orBuild)生命周期
这是Maven的主要生命周期,被用于构建应用。包括下面的23个阶段。
| 生命周期阶段 | 描述 |
|---|---|
| validate | 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。 |
| initialize | 初始化构建状态,例如设置属性。 |
| generate-sources | 生成编译阶段需要包含的任何源码文件。 |
| process-sources | 处理源代码,例如,过滤任何值(filteranyvalue)。 |
| generate-resources | 生成工程包中需要包含的资源文件。 |
| process-resources | 拷贝和处理资源文件到目的目录中,为打包阶段做准备。 |
| compile | 编译工程源码。 |
| process-classes | 处理编译生成的文件,例如JavaClass字节码的加强和优化。 |
| generate-test-sources | 生成编译阶段需要包含的任何测试源代码。 |
| process-test-sources | 处理测试源代码,例如,过滤任何值(filteranyvalues)。 |
| test-compile | 编译测试源代码到测试目的目录。 |
| process-test-classes | 处理测试代码文件编译后生成的文件。 |
| test | 使用适当的单元测试框架(例如JUnit)运行测试。 |
| prepare-package | 在真正打包之前,为准备打包执行任何必要的操作。 |
| package | 获取编译后的代码,并按照可发布的格式进行打包,例如JAR、WAR或者EAR文件。 |
| pre-integration-test | 在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量。 |
| integration-test | 处理和部署必须的工程包到集成测试能够运行的环境中。 |
| post-integration-test | 在集成测试被执行后执行必要的操作。例如,清理环境。 |
| verify | 运行检查操作来验证工程包是有效的,并满足质量要求。 |
| install | 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。 |
| deploy | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。 |
有一些与Maven生命周期相关的重要概念需要说明:
当一个阶段通过Maven命令调用时,例如mvncompile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行。
不同的maven目标将根据打包的类型(JAR/WAR/EAR),被绑定到不同的Maven生命周期阶段。
在下面的例子中,我们将maven-antrun-plugin:run目标添加到Build生命周期的一部分阶段中。这样我们可以显示生命周期的文本信息。
我们已经更新了C:\MVN\project目录下的pom.xml文件。
4.0.0 com.companyname.projectgroup project 1.0 org.apache.maven.plugins maven-antrun-plugin 1.1 id.validate validate run validatephase id.compile compile run compilephase id.test test run testphase id.package package run packagephase id.deploy deploy run deployphase
现在打开命令控制台,跳转到pom.xml所在目录,并执行以下mvn命令。
C:\MVN\project>mvncompile
Maven将会开始处理并显示直到编译阶段的构建生命周期的各个阶段。
[INFO]Scanningforprojects...
[INFO]------------------------------------------------------------------
[INFO]BuildingUnnamed-com.companyname.projectgroup:project:jar:1.0
[INFO]task-segment:[compile]
[INFO]------------------------------------------------------------------
[INFO][antrun:run{execution:id.validate}]
[INFO]Executingtasks
[echo]validatephase
[INFO]Executedtasks
[INFO][resources:resources{execution:default-resources}]
[WARNING]Usingplatformencoding(Cp1252actually)tocopyfilteredresources,
i.e.buildisplatformdependent!
[INFO]skipnonexistingresourceDirectoryC:\MVN\project\src\main\resources
[INFO][compiler:compile{execution:default-compile}]
[INFO]Nothingtocompile-allclassesareuptodate
[INFO][antrun:run{execution:id.compile}]
[INFO]Executingtasks
[echo]compilephase
[INFO]Executedtasks
[INFO]------------------------------------------------------------------
[INFO]BUILDSUCCESSFUL
[INFO]------------------------------------------------------------------
[INFO]Totaltime:2seconds
[INFO]Finishedat:SatJul0720:18:25IST2012
[INFO]FinalMemory:7M/64M
[INFO]------------------------------------------------------------------
Site生命周期
MavenSite插件一般用来创建新的报告文档、部署站点等。
阶段:
pre-site
site
post-site
site-deploy
在下面的例子中,我们将maven-antrun-plugin:run目标添加到Site生命周期的所有阶段中。这样我们可以显示生命周期的所有文本信息。
我们已经更新了C:\MVN\project目录下的pom.xml文件。
4.0.0 com.companyname.projectgroup project 1.0 org.apache.maven.plugins maven-antrun-plugin 1.1 id.pre-site pre-site run pre-sitephase id.site site run sitephase id.post-site post-site run post-sitephase id.site-deploy site-deploy run site-deployphase
现在打开命令控制台,跳转到pom.xml所在目录,并执行以下mvn命令。
C:\MVN\project>mvnsite
Maven将会开始处理并显示直到site阶段的site生命周期的各个阶段。
[INFO]Scanningforprojects...
[INFO]------------------------------------------------------------------
[INFO]BuildingUnnamed-com.companyname.projectgroup:project:jar:1.0
[INFO]task-segment:[site]
[INFO]------------------------------------------------------------------
[INFO][antrun:run{execution:id.pre-site}]
[INFO]Executingtasks
[echo]pre-sitephase
[INFO]Executedtasks
[INFO][site:site{execution:default-site}]
[INFO]Generating"About"report.
[INFO]Generating"IssueTracking"report.
[INFO]Generating"ProjectTeam"report.
[INFO]Generating"Dependencies"report.
[INFO]Generating"ProjectPlugins"report.
[INFO]Generating"ContinuousIntegration"report.
[INFO]Generating"SourceRepository"report.
[INFO]Generating"ProjectLicense"report.
[INFO]Generating"MailingLists"report.
[INFO]Generating"PluginManagement"report.
[INFO]Generating"ProjectSummary"report.
[INFO][antrun:run{execution:id.site}]
[INFO]Executingtasks
[echo]sitephase
[INFO]Executedtasks
[INFO]------------------------------------------------------------------
[INFO]BUILDSUCCESSFUL
[INFO]------------------------------------------------------------------
[INFO]Totaltime:3seconds
[INFO]Finishedat:SatJul0715:25:10IST2012
[INFO]FinalMemory:24M/149M
[INFO]------------------------------------------------------------------```
以上就是本文关于Maven构建生命周期详细介绍的全部内容,希望对大家有所帮助。欢迎参阅:Maven管理SpringBootProfile详解、maven学习-初窥门径、使用maven运行JavaMain的三种方法解析等,如有不足之处,欢迎留言指出,感谢朋友们对本站的支持。