文章目录
  1. 1. build lifecycle是由phases构成的
    1. 1.1. default
    2. 1.2. clean
    3. 1.3. site
  2. 2. 构建phases是由plugin Goals组成
  3. 3. 使用lifecycle创建项目
    1. 3.1. packaging
    2. 3.2. plugin

Maven是基于构建生命周期的,就是说构建和分发一个特定的artifact(或者project)的过程是明确定义的。

一共有三种类型:

  • default:处理项目部署
  • clean:处理项目清理
  • site:处理项目网站文档生成

build lifecycle是由phases构成的

build lifecycle是由不同的phases序列构成,然后build项目的时候,这些phases会被顺序执行。下面我们就给出三种类型的lifecycle的phases完整序列。

default

  1. validate:验证
  2. initialize: 初始化配置,比如properties
  3. generate-sources: 生成所有需要包含在编译过程中的源代码
  4. process-sources: 处理源代码,比如过滤一些值
  5. generate-resources:生成所有需要包含在打包过程中的资源文件
  6. process-resources: 复制并处理资源文件至目标目录,准备打包
  7. complie: 编译源代码
  8. process-classes:处理编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement)
  9. generate-test-sources:生成所有包含在测试编译过程中的测试源码
  10. process-test-sources:处理测试源码,比如过滤一些值
  11. generate-test-resources:生成测试需要的资源文件
  12. process-test-resources: 复制并处理测试资源文件至测试目标目录
  13. test-compile: 编译测试源码至测试目标目录
  14. process-test-classes:处理测试编译生成的文件,例如对Java类进行字节码增强(bytecode enhancement)
  15. test:使用合适的单元测试框架运行测试。这些测试应该不需要代码被打包或发布
  16. prepare-package:在真正的打包之前,执行一些准备打包必要的操作。这通常会产生一个包的展开的处理过的版本
  17. package:将编译好的代码打包成可分发的格式,如JAR,WAR,或者EAR
  18. pre-integration-test:执行一些在集成测试运行之前需要的动作。如建立集成测试需要的环境
  19. integration-test:如果有必要的话,处理包并发布至集成测试可以运行的环境
  20. post-integration-test: 执行一些在集成测试运行之后需要的动作。如清理集成测试环境
  21. verify:执行所有检查,验证包是有效的,符合质量规范
  22. install:安装包至本地仓库,以备本地的其它项目作为依赖使用
  23. deploy:复制最终的包至远程仓库,共享给其它开发人员和项目(通常和一次正式的发布相关)

clean

  1. pre-clean: 准备清理
  2. clean: 真正的清理
  3. post-clean: 执行清理之后的一些后续工作。

site

  1. pre-site:准备生成站点
  2. site:生成站点及稳定
  3. post-site:站点收尾
  4. site-deploy:将生成的站点发布到服务器上

对于default lifecycle,如果你想执行上面提到的所有指令,只需要mvn deploy,maven会自动帮你把deploy之前的所有phases按照顺序执行一遍。

一个mvn命令可以执行多个phases,如:

mvn clean install

该命令是先执行clean phases,然后执行install phase。

构建phases是由plugin Goals组成

其实maven的生命周期仅仅是个抽象的标准,真正做事的是maven plugin。每个lifecycle phase实质上都会绑定到某个plugin:goal上,比如命令

mvn compile

实际上等价于

mvn compiler:compile

即执行compile phase指令 = 执行compiler plugin的compile goal

使用lifecycle创建项目

maven构建lifecycle很容易使用,下面就介绍其使用方法

packaging

pom.xml的的值(default是jar)会直接影响mvn lifecyclephase的执行操作,即不同的值将影响lifecycle phase与哪个plugin:goal绑定。

例如:jar那么绑定关系如下:

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

如果是war,那么package phase会绑定到war.war

如果是pom,那么上面只有install和deploy会被绑定,

plugin

配置plugin也是使用maven构建项目的一种手段。如果某个phase被绑定了1个以上的goal,那么在执行该phase的mvn命令时,会先执行本省所绑定的goal,然后再执行绑定的goals,更可以使用来控制goal的执行顺序。

例如:有一个Modello plugin,它总是绑定modello:java到generate-source phase。

<plugin>
  <groupId>org.codehaus.modello</groupId>
  <artifactId>modello-maven-plugin</artifactId>
  <version>1.4</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>

可以对同一个goal根据不同的来执行多次。如果有多个匹配某个phase的,那么他们将会被依次按顺序执行(被继承的会先被执行)

设置绑定不是自己在pom.xml中定义,而是plugin本身就已经定义好。那我们如何能够将goal绑定到另外的、非内在的phase上,我们可以在中设置。比如下面的例子,该plugin是绑定在test phase上,我们想让它也绑定到process-test-resources phase上。

<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>
文章目录
  1. 1. build lifecycle是由phases构成的
    1. 1.1. default
    2. 1.2. clean
    3. 1.3. site
  2. 2. 构建phases是由plugin Goals组成
  3. 3. 使用lifecycle创建项目
    1. 3.1. packaging
    2. 3.2. plugin