Maven基础系列(一)

构建流程

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,它会执行3phase

  • 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:清理所有生成的classjarmvn clean compile:先清理,再执行到compilemvn clean test:先清理,再执行到test,因为执行test前必须执行compile,所以这里不必指定compilemvn 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。