共计 1886 个字符,预计需要花费 5 分钟才能阅读完成。
构建流程
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
- initialize
- …
- prepare-package
- package
如果我们运行 mvn compile
,Maven 也会执行default
生命周期,但这次它只会运行到compile
,即以下几个 phase:
- validate
- initialize
- …
- process-resources
- 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(开始执行 default 生命周期的第一个 phase)
- initialize
- …
- prepare-package
- 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 服务器:
$ mvn tomcat:run
小结
Maven 通过 lifecycle、phase 和 goal 来提供标准的构建流程。
最常用的构建命令是指定 phase,然后让 Maven 执行到指定的 phase:
- mvn clean
- mvn clean compile
- mvn clean test
- mvn clean package
通常情况,我们总是执行 phase 默认绑定的 goal,因此不必指定 goal。