生命周期
Maven 有三种不同的生命周期,分别为 default、clean、site,Maven 在执行时需要选择其中的一种生命周期来执行。一个生命周期有多个阶段,这些阶段都是有顺序的,我们在构建项目时需要指定执行哪一个阶段,之后 Maven 在执行时会按顺序把该阶段和之前的所有阶段都执行一遍。一个阶段可以关联零个或多个插件的目标,而执行阶段其实也就是在执行该阶段所关联的插件目标。如下图是 default 生命周期的所有阶段。
用户要执行的阶段所在的生命周期就是 Maven 选择的生命周期。
Maven 可以一次性执行一个或多个阶段,但一次性执行多个阶段和独立执行这些阶段完全等价。
mvn clean
mvn compile
# 完全等价于
mvn clean compile
捆绑插件
生命周期默认会捆绑一些插件。在 default 生命周期中,对于不同类型的项目(POM 文件中 packaging 标签的定义的类型),Maven 会在不同的阶段中捆绑不同的插件,而对于 clean 和 site 生命周期,Maven 会为所有类型的项目都捆绑一些固定的插件。如下图是 default 生命周期中对于 pom 和 jar 类型的项目默认捆绑的插件。
插件目标
一个插件中包含多个目标,每个目标都有着不同的功能,而阶段在关联插件时其实是关联插件的某些目标,并且不同的阶段可以关联同一个插件中的同一个目标。项目在引入插件后需要手动配置插件,也就是将哪些目标关联到哪些阶段上。在引入插件时可以在 <executions>
标签中配置插件。
<build>
<plugins>
<plugin>
<groupId>com.example</groupId>
<artifactId>my-plugin</artifactId>
<version>1.0.0</version>
<executions>
<!-- 在compile阶段执行插件的goal-1目标 -->
<execution>
<id>execution-1</id>
<phase>compile</phase>
<goals>
<goal>goal-1</goal>
</goals>
</execution>
<!-- 在install阶段执行插件的goal-2和goal-3目标 -->
<execution>
<id>execution-2</id>
<phase>install</phase>
<goals>
<goal>goal-2</goal>
<goal>goal-3</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
插件默认会将一些目标关联到某个阶段上,但这些关联行为是独立的,并不会被我们自己配置的关联所覆盖,也就是说如果我们手动配置了同样的关联关系,则该关联关系会执行两遍,因此如果引入的插件的默认配置能够满足需求则无需再手动配置插件。
有些插件目标虽然关联了某个阶段,但如果在该阶段中有一些条件未满足则插件目标不会被执行。
查看插件信息
通过 mvn help:describe
命令可以查看插件的信息,该插件的 plugin
参数用于指定要查看哪个插件的信息,格式为 groupId:artifactId[:version]
,如果不指定 version
则默认查看最新版本的信息。
mvn help:describe "-Dplugin=org.springframework.boot:spring-boot-maven-plugin"
mvn help:describe "-Dplugin=org.springframework.boot:spring-boot-maven-plugin:3.2.0"
默认输出指定插件和该插件所有目标的描述信息,如果添加 minimal
参数则只输出插件的描述信息,如果添加 detail
则额外输出插件目标的参数信息。
mvn help:describe "-Dplugin=org.springframework.boot:spring-boot-maven-plugin" -Dminimal
mvn help:describe "-Dplugin=org.springframework.boot:spring-boot-maven-plugin" -Ddetail
如果只想输出某个目标的描述信息,可以使用 goal
参数,此时添加 detail
参数可以额外输出该目标的参数信息。
mvn help:describe "-Dplugin=org.springframework.boot:spring-boot-maven-plugin" "-Dgoal=run"
mvn help:describe "-Dplugin=org.springframework.boot:spring-boot-maven-plugin" "-Dgoal=run" -Ddetail
执行插件
插件目标可以自动执行也可以手动执行。如果插件目标被关联到某个阶段中,则在执行这些阶段时会自动执行插件目标。插件目标也可以单独执行,此时可以无需在 POM 文件中引入该插件。
mvn org.springframework.boot:spring-boot-maven-plugin:run
mvn org.springframework.boot:spring-boot-maven-plugin:3.2.0:run
在执行插件目标时如果目标有前置阶段的话,则 Maven 会先去完完整整地执行该前置阶段,然后才会去执行指定的目标。
全局前缀
插件都有全局前缀,在使用时可以将 groupId:artifactId
替换成全局前缀以简化操作。当使用全局前缀时,Maven 会去项目使用的所有插件中(捆绑的和引入的)寻找对应的插件,如果没找到则看该全局前缀是不是内置的,如果都不是则会报错。因此在使用全局前缀时,只能使用内置的或项目使用的插件的全局前缀。
groupId
为org.apache.maven.plugins
或org.codehaus.mojo
的插件的全局前缀为内置前缀。
mvn spring-boot:run
mvn help:describe "-Dplugin=spring-boot"
上面命令使用的是全局前缀为
help
的插件,该插件的实际名称为org.apache.maven.plugins:maven-help-plugin
,虽然项目没有使用该插件,但由于该插件的groupId
为org.apache.maven.plugins
因此可以直接使用对于的全局前缀。