1.概念关系
生命周期(LifeCircle)由阶段(phase)组成,阶段之间存在先序关系,阶段可以理解为构建过程中的一个步骤,如编译就是一个阶段。
生命周期是maven根据项目构建中常用步骤抽象出了3个内置的生命周期clean、default、site,clean用于清理构建产生的数据,default用于项目部署,site用于生成项目文档。
maven设计为了更灵活,每个阶段可以有不同的实现,这个实现由插件实现,一个插件可以实现多个阶段,即目标。如下图,用Java的继承机制理解,可以把每个阶段Phase都当成一个接口,插件就是实现了多个接口(阶段)的实现类,目标就是Override接口方法的实现方法。
以packaging配置为jar为例 ,default默认的阶段 和绑定的目标如下
生命周期阶段Phase | 插件:目标plugin:goal |
process-resources | maven-resources-plugin:resources |
compile | maven-compiler-plugin:compile |
process-test-resources | maven-resources-plugin:testResources |
test-compile | maven-compiler-plugin:testCompile |
test | maven-surefire-plugin:test |
package | maven-jar-plugin:jar |
install | maven-install-plugin:install |
deploy | maven-deploy-plugin:deploy |
2.构建操作
2.1 常用操作
执行构建命令会按照生命周期中定义的阶段顺序逐一执行,mvn命令可接收多个目标或阶段
mvn [options] [<goal(s)>] [<phase(s)>]
mvn install
mvn clean deploy
mvn clean dependency:copy-dependencies package
如上的命令,当指定生命周期中的一个阶段,maven会执行该阶段所在生命周期的前序所有阶段。
如mvn install执行时会执行install阶段执行之前会依次执行validate
, compile
, package等等。
而mvn clean deploy 涉及了两个生命周期,会执行clean周期中的pre-clean阶段和clean阶段;然后执行default周期中deploy之前的所有阶段。
mvn clean dependency:copy-dependencies package 这个命令逐一执行clean阶段(及其前驱阶段)、dependency:copy-dependencies目标、package阶段(及其前驱阶段)
2.2.maven默认生命周期&默认绑定
maven定义了3个生命周期,在配置文件<<<META-INF/plexus/components.xml>>>,如maven/maven-core/src/main/resources/META-INF/plexus/components.xml,如default生命周期定义如下:
<component>
<role>org.apache.maven.lifecycle.Lifecycle</role>
<implementation>org.apache.maven.lifecycle.Lifecycle</implementation>
<role-hint>default</role-hint>
<configuration>
<id>default</id>
<!-- START SNIPPET: lifecycle -->
<phases>
<phase>validate</phase>
<phase>initialize</phase>
<phase>generate-sources</phase>
<phase>process-sources</phase>
<phase>generate-resources</phase>
<phase>process-resources</phase>
<phase>compile</phase>
<phase>process-classes</phase>
<phase>generate-test-sources</phase>
<phase>process-test-sources</phase>
<phase>generate-test-resources</phase>
<phase>process-test-resources</phase>
<phase>test-compile</phase>
<phase>process-test-classes</phase>
<phase>test</phase>
<phase>prepare-package</phase>
<phase>package</phase>
<phase>pre-integration-test</phase>
<phase>integration-test</phase>
<phase>post-integration-test</phase>
<phase>verify</phase>
<phase>install</phase>
<phase>deploy</phase>
</phases>
<!-- END SNIPPET: lifecycle -->
</configuration>
</component>
此处并没有定义阶段的具体实现,绑定目标在另一个配置文件中maven/maven-core/src/main/resources/META-INF/plexus/default-bindings.xml中,其中为了每种打包方式都分别指定了各个所需阶段对应的绑定目标。如jar打包方式
<component>
<role>org.apache.maven.lifecycle.mapping.LifecycleMapping</role>
<role-hint>jar</role-hint>
<implementation>org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping</implementation>
<configuration>
<lifecycles>
<lifecycle>
<id>default</id>
<!-- START SNIPPET: jar-lifecycle -->
<phases>
<process-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:resources
</process-resources>
<compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
</compile>
<process-test-resources>
org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
</process-test-resources>
<test-compile>
org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
</test-compile>
<test>
org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
</test>
<package>
org.apache.maven.plugins:maven-jar-plugin:2.4:jar
</package>
<install>
org.apache.maven.plugins:maven-install-plugin:2.4:install
</install>
<deploy>
org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
</deploy>
</phases>
<!-- END SNIPPET: jar-lifecycle -->
</lifecycle>
</lifecycles>
</configuration>
</component>
与上述表格的对应关系一致。
2.3 自定义目标并绑定
执行mvn命令时,执行了shell脚本,会使用launcher加载maven入口类org.apache.maven.cli.MavenCli
当需要自己定制化绑定时可以通过plugin元素配置,下面的样例中是自己实现类display-maven-plugin,然后绑定目标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>