官方说明: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
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 |
来源:oschina
链接:https://my.oschina.net/u/3452433/blog/3168181