构建流程
Maven不但有标准化的项目结构,而且还有一套标准化的构建流程,可以自动化实现编译,打包,发布,等等。
Lifecycle和Phase
使用Maven时,我们首先要了解什么是Maven的生命周期(lifecycle
)。
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
。
更复杂的例子是指定多个phase
例如,运行mvn clean package
,Maven先执行clean
生命周期并运行到clean
这个phase
,然后执行default
生命周期并运行到package
这个phase
,实际执行的phase
如下:
- pre-clean
- clean (注意这个clean是phase)
- validate
- …
- package
在实际开发过程中,经常使用的命令有:
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
:
执行的Phase | 对应执行的Goal |
---|---|
compile | compiler:compile |
test | compiler:testCompile surefire:test |
goal的命名总是abc:xyz
这种形式。
如果此处还不明白
**lifecycle**
、**phase**
和**goal**
,那么类比一下:
lifecycle
相当于Java**的**package
,它包含一个或多个phase
;phase
相当于Java**的**class
,它包含一个或多个goal
;goal
相当于class**的**method
,它其实才是真正干活的。
大多数情况,我们只要指定phase
,就默认执行这些phase
默认绑定的goal
,只有少数情况,我们可以直接指定运行一个goal
例如,启动Tomcat服务器:
:::info
mvn tomcat:run
:::
本章小结
Maven通过lifecycle、phase和goal来提供标准的构建流程。
最常用的构建命令是指定phase,然后让Maven执行到指定的phase:
mvn clean
mvn clean compile
mvn clean test
mvn clean package
通常情况,我们总是执行phase默认绑定的goal,因此不必指定goal。