### Lifecycle和Phase
Maven的生命周期由一系列阶段(phase)构成,以内置的生命周期`default`为例,它包含以下phase:
- validate
- initialize
- generate-sources
- process-sources
- generate-resources
- process-resources
- compile
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources
- test-compile
- process-test-classes
- test
- prepare-package
- package
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install
- deploy
如果我们运行`mvn package`,Maven就会执行`default`生命周期,它会从开始一直运行到`package`这个phase为止:
- validate
- ...
- package
如果我们运行`mvn compile`,Maven也会执行`default`生命周期,但这次它只会运行到`compile`,即以下几个phase:
- validate
- ...
- compile
Maven另一个常用的生命周期是`clean`,它会执行3个phase:
- pre-clean
- clean (注意这个clean不是lifecycle而是phase)
- post-clean
所以,我们使用`mvn`这个命令时,后面的参数是phase,Maven自动根据生命周期运行到指定的phase。
### 常用命令
在实际开发过程中,经常使用的命令有:
`mvn clean`:清理所有生成的class和jar;
`mvn clean compile`:先清理,再执行到`compile`;
`mvn clean test`:先清理,再执行到`test`,因为执行`test`前必须执行`compile`,所以这里不必指定`compile`;
`mvn clean package`:先清理,再执行到`package`。
大多数phase在执行过程中,因为我们通常没有在`pom.xml`中配置相关的设置,所以这些phase什么事情都不做。
经常用到的phase:
- clean:清理
- compile:编译
- test:运行测试
- package:打包
### Goal
执行一个phase又会触发一个或多个goal:
其实我们类比一下就明白了:
- lifecycle相当于Java的package,它包含一个或多个phase;
- phase相当于Java的class,它包含一个或多个goal;
- goal相当于class的method,它其实才是真正干活的。