Maven-lifecycle、phase、goal

对一个项目进行打包时,maven分别执行了 validate->compile->test->package,这个过程就是生命周期(lifecycle)。在生命周期的过程中会有很多的阶段(phase),这些阶段按照既定的顺序执行来完成一个项目的构建。

在生命周期中,各个阶段的工作由插件(plugin)来完成,一个插件通常可以完成一个或者多个阶段的工作。每个阶段的工作对应插件中的一个目标(goal)。不同的插件结合起来,就完成了整个项目的构建。

生命周期-lifecycle

maven的生命周期可以分为三大类:

  1. Clean Lifecycle:在进行真正的构建之前进行一些清理工作
  2. Default Lifecycle:构建的核心部分,编译,测试,打包,部署等等
  3. Site Lifecycle:生成项目报告,站点,发布站点

Clean Lifecycle

生命周期Clean Lifecycle包含的阶段(phase)

  • pre-clean:执行一些需要在clean之前完成的工作
  • clean:移除所有上一次构建生成的文件
  • post-clean:执行一些需要在clean之后立刻完成的工作

Default Lifecycle

生命周期Default Lifecycle包含的阶段(phase)

  • validate:验证工程是否正确,所需的信息是否完整
  • initialize:初始化构建平台,例如:设置properties或创建目录
  • 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:编译测试源代码(默认是test目录下)
  • process-test-class
  • test:执行单元测试
  • prepare-package
  • package:将工程文件打包为指定的格式,例如JAR,WAR等
  • pre-integration-test
  • integration-test:集成测试
  • post-integration-test
  • verify:检查package是否有效、符合标准
  • install:将包安装至本地仓库,以让其它项目依赖。
  • deploy:将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

Site Lifecycle

生命周期Site Lifecycle包含的阶段(phase)

  • pre-site:执行一些需要在生成站点文档之前完成的工作
  • site:生成项目的站点文档
  • post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy:将生成的站点文档部署到特定的服务器上

注:执行一个phase将会执行这个lifecycle前面的所有phase

goal

执行phase实际执行的是goal。如果一个phase没有绑定goal,那这个phase就不会被执行。一些phase默认已经绑定了一些goal。例如:阶段compile绑定的goal是compiler:compile、阶段package绑定的goal是jar:jar。
所以,phase其实就是goal的容器,实际被执行的都是goal。phase被执行时,实际执行的都是被绑定到该phase的goal。

例子:

mvn clean dependency:copy-dependencies package
  • clean是phase。
  • dependency:copy-dependencies是goal。maven-dependency-plugin插件的copy-dependencies(goal目标)。
  • package也是一个phase。

maven会顺序执行这3个对象中包含的所有goal。clean阶段会首先执行(包括在它以前的阶段),然后是dependency:copy-dependencies插件目标,最后package阶段被执行(包括它之前的阶段)。

注:dependency:copy-dependencies是一种 “前缀:目标” 的简写方式。默认情况下,Maven通过去除artifactId的maven和plugin来确定插件前缀

  • maven-${prefix}-plugin:官方插件使用的artifactId
  • ${prefix}-maven-plugin:其他来源的插件(如 tomcat 插件:tomcat7-maven-plugin)

所以,dependency:copy-dependencies表示使用maven-dependency-plugin插件的copy-dependencies目标。

自定义plugin

我们可以通过在project中使用plugin,将各种各样的goal加入到Maven的phase中,从而根据自己的实际需求,灵活实现各种定制功能。

如何将display-maven-plugin中的goal time绑定到process-test-resources这个phase中

<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.0http://maven.apache.org/maven-v4_0_0.xsd">    
   
   ...
   
   <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>
</project>

在编译时执行HelloWord类的man方法

<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.0http://maven.apache.org/maven-v4_0_0.xsd">    
   
   ...
   <plugin>
       <groupId>org.codehaus.mojo</groupId>
       <artifactId>exec-maven-plugin</artifactId>
       <version>1.2.1</version>
       <executions>
           <execution>
               <!-- 绑定到编译的生命周期 -->
               <phase>compile</phase>
               <goals>
                   <!-- 执行目标java -->
                   <goal>java</goal>
               </goals>
               <configuration>
                   <mainClass>x.x.x.HelloWord</mainClass>
               </configuration>
           </execution>
       </executions>
   </plugin>
</project>

如果想知道插件中包含哪些goal:

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-eclipse-plugin:2.10

输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会叫的狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值