Apache Maven 项目构建的生命周期

折月煮酒 提交于 2020-02-25 17:16:49

官方说明:https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

 

基础知识

Maven通过生命周期的概念,将项目的构建和分发过程分步骤进行了清晰的定义。对于构建项目的人来说,只需要学习一组命令就可以构建任何Maven项目。每个步骤的执行属性和参数都可以使用POM文件进行定义。

 

构建和阶段

maven的生命周期由三个内置的构建组成:

clean 用于处理项目清理。主要阶段包括clean

default 用于处理项目部署。其中主要阶段包括validate、compile、test、package、verify、install、deploy

site 处理站点文档的创建。其中主要阶段包括site

这些生命周期阶段(加上这里没有显示的其他生命周期阶段)按顺序执行,以完成默认的生命周期。

阶段 命令 说明
clean mvn clean 删除以前生成的所有文件。
validate mvn validate 确认项目是正确的,所有必要的信息都是可用的。
compile mvn compile 编译项目的源代码。
test mvn test 使用合适的单元测试框架运行测试。这些测试不应该要求对代码进行打包或部署。
package mvn package 将编译后的代码打包成可分发的格式,例如JAR。
verify mvn verify 运行任何检查来验证包是否有效并满足质量标准。
install mvn install 将包安装到本地存储库中,作为本地其他项目的依赖项使用。
deploy mvn deploy 在集成或发布环境中完成,将最终的包复制到远程存储库,以便与其他开发人员和项目共享。
site mvn site 生成项目的站点文档

同一个命令可以在多模块场景中使用(例如,一个项目有一个或多个子项目)。Maven遍历每个子项目并执行命令(包括前面的所有构建阶段步骤)。

 

插件和目标

插件是向Maven提供目标的构件,一个插件可能有一个或多个目标,其中每个目标代表该插件的一个功能。

即使阶段负责构建生命周期中的特定步骤,它执行这些职责的方式也可能不同。这是通过声明绑定到那些阶段目标来实现的, 也就是说同样是package构建阶段但是绑定了不同的目标而会产生不同行为。

插件目标是一个特定的任务,可以绑定到某个构建阶段也可以单独执行。例如,下面的例子dependency:copy-dependencies就是一个插件目标,而package是一个构建阶段。

mvn clean dependency:copy-dependencies package

如果一个目标被绑定到一个或多个构建阶段,那么该目标将在所有这些阶段中被调用。阶段还可以有零个或多个目标与之绑定。如果阶段没有绑定目标,那么该阶段将不会执行。但是如果它绑定了一个或多个目标,它将执行所有这些目标。

 

项目生命周期设置

Packaging

我们可以通过项目的POM元素<packaging>设置项目的打包类型。默认的包装值是jar、war、ear和pom,如果没有指定打包值,则默认为jar。
每个打包要绑定到特定阶段的插件目标。例如,jar打包将绑定以下目标来构建默认生命周期的各个阶段。
Phase plugin:goal
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar
install install:install
deploy deploy:deploy

Plugins

向构建阶段添加插件目标的方法是在项目中的pom文件进行配置。插件是向Maven提供目标的构件,一个插件可能有一个或多个目标,其中每个目标代表该插件的一个功能。例如,Compiler插件有两个目标: compile testCompile 。前者编译主代码的源代码,而后者编译测试代码的源代码。

插件可以包含将插件目标绑定到哪个生命周期阶段的信息。请注意,仅添加插件本身是不够的——您还必须指定希望作为构建的一部分运行的插件目标。

配置的插件目标将被绑定到,所选包的生命周期目标中。如果将多个目标绑定到特定阶段,则使用的顺序是首先执行来自包装的目标,然后执行POM中配置的目标。注意,您可以使用 <executions> 元素来获得对特定目标顺序的更多控制。

例如,Modello插件默认将其目标 modello:java 绑定到 generate-sources 阶段(注意: modello:java 目标生成java源代码)。因此,要使用Modello插件并让它从模型生成源代码并将其合并到构建中,您需要在 <build> <plugins> 部分中向POM添加以下内容:

...
 <plugin>
   <groupId>org.codehaus.modello</groupId>
   <artifactId>modello-maven-plugin</artifactId>
   <version>1.8.1</version>
   <executions>
     <execution>
       <configuration>
         <models>
           <model>src/main/mdo/maven.mdo</model>
         </models>
         <version>4.0.0</version>
       </configuration>
       <goals>
         <goal>java</goal>
       </goals>
     </execution>
   </executions>
 </plugin>
...

您可能想知道为什么会有 <executions>元素。如果需要您可以使用不同的配置多次运行相同的目标。还可以为单独的执行提供一个ID,以便在继承或概要文件应用程序期间控制目标配置是合并还是转换为附加执行。当多个执行与特定阶段相匹配时,它们将按照POM中指定的顺序执行,首先运行继承的执行。

现在,对于 modello:java ,它只在 generate-sources 阶段有意义。但是,有些目标可以在多个阶段中使用,因此可能不会出现合理的默认情况,您可以自己指定阶段。例如,假设您有一个目标 display:time 响应当前时间到命令行,您希望它在 process-test-resources 阶段运行,以指示何时开始测试。配置如下:

...
 <plugin>
   <groupId>com.mycompany.example</groupId>
   <artifactId>display-maven-plugin</artifactId>
   <version>1.0</version>
   <executions>
     <execution>
       <phase>process-test-resources</phase>
       <goals>
         <goal>time</goal>
       </goals>
     </execution>
   </executions>
 </plugin>
...

 

完整的列生命周期列表

下面列出了default clean site 生命周期的所有构建阶段,它们按照指定的顺序执行。(来自官方文档)

Clean Lifecycle

Phase Description
pre-clean 在实际项目清理之前执行所需的过程
clean 删除以前生成的所有文件
post-clean 执行完成项目清理工作所需的流程

Default Lifecycle

Phase Description
validate 确认项目是正确的,所有必要的信息都是可用的。
initialize 初始化构建状态,例如设置属性或创建目录。
generate-sources 生成编译中包含的任何源代码。
process-sources 处理源代码,例如过滤任何值。
generate-resources 生成包中包含的资源。
process-resources 将资源复制并处理到目标目录中,准备打包。
compile 编译项目的源代码。
process-classes 对编译生成的文件进行后处理,例如对Java类进行字节码增强。
generate-test-sources 生成编译中包含的任何测试源代码。
process-test-sources 处理测试源代码,例如过滤任何值。
generate-test-resources 为测试创建资源。
process-test-resources 将资源复制并处理到测试目标目录中。
test-compile 将测试源代码编译到测试目标目录中
process-test-classes 对测试编译生成的文件进行后处理,例如对Java类进行字节码增强。适用于Maven 2.0.5及以上。
test 使用合适的单元测试框架运行测试。这些测试不应该要求对代码进行打包或部署。
prepare-package 在包装前进行任何必要的准备工作。这通常会导致一个未打包的、经过处理的包。(Maven 2.1及以上)
package 将编译后的代码打包成可分发的格式,例如JAR。
pre-integration-test 在执行集成测试之前执行所需的操作。这可能涉及诸如设置所需环境之类的事情。
integration-test 如果需要,处理和部署包到可以运行集成测试的环境中。
post-integration-test 执行集成测试后所需的操作。这可能包括清理环境。
verify 运行任何检查来验证包是否有效并满足质量标准。
install 将包安装到本地存储库中,作为本地其他项目的依赖项使用。
deploy 在集成或发布环境中完成,将最终的包复制到远程存储库,以便与其他开发人员和项目共享。

Site Lifecycle

Phase Description
pre-site 在实际项目站点生成之前执行所需的过程
site 生成项目的站点文档
post-site 执行完成站点生成和准备站点部署所需的流程
site-deploy 将生成的站点文档部署到指定的web服务器

 

内置阶段目标绑定

有些阶段的目标是默认绑定的。对于默认的生命周期,这些绑定依赖于打包值。

下面是一些构建阶段与插件目标的绑定关系。

Clean Lifecycle Bindings

Phase plugin:goal
clean clean:clean

Default Lifecycle Bindings - Packaging ejb / ejb3 / jar / par / rar / war

Phase plugin:goal
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war
install install:install
deploy deploy:deploy

Default Lifecycle Bindings - Packaging ear

Phase plugin:goal
generate-resources ear:generate-application-xml
process-resources resources:resources
package ear:ear
install install:install
deploy deploy:deploy

Default Lifecycle Bindings - Packaging maven-plugin

Phase plugin:goal
generate-resources plugin:descriptor
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar and plugin:addPluginArtifactMetadata
install install:install
deploy deploy:deploy

Default Lifecycle Bindings - Packaging pom

Phase plugin:goal
package  
install install:install
deploy deploy:deploy

Site Lifecycle Bindings

Phase plugin:goal
site site:site
site-deploy site:deploy
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!