生命周期
对于Java项目来说,一个项目的生命周期可能会有创建项目、编译、打包、运行、部署等,而maven将项目的生命周期进行了标准化。
Maven默认支持的生命周期有clean、site、default,其中 site这个生命周期几乎用不到,最常用的就是clean与default。
阶段
在maven中,每一个生命周期都对应多个阶段。
clean生命周期的阶段如下:
pre-clean
clean (注意这个clean不是lifecycle而是phase)
post-clean
default生命周期的阶段有如下:
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 命令后面跟的参数其实不是生命周期而是阶段,例如 mvn clean 表示找到clean这个生命周期,然后从这个这个生命周期最开始的阶段到clean这个阶段也就是 pre-clean、clean。平时比较常用的 mvn package 就是会找到default这个生命周期,然后一直从validate 阶段执行到 package 这个阶段。
插件目标
光有阶段还不够,代码的编译、测试、打包其实都是通过一个个的插件目标做的,这些插件目标其实就是一个个的Java类,一个阶段可以绑定一个或多个目标,例如执行 mvn package 就可以看到每个插件绑定的目标。
很多生命周期的阶段目标maven都已经内置好了,如果需要自定义插件,希望可以在maven生命周期的某个阶段执行自定义的目标,可以通过定制pom.xml实现。
<plugin>
<!--源码插件引入-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<!--执行计划-->
<executions>
<execution>
<!--在哪个生命周期阶段执行-->
<phase>install</phase>
<!--执行别名-->
<id>build-source</id>
<goals>
<!--插件目标-->
<goal>jar-no-fork</goal>
</goals>
</execution>
<execution>
<!--在哪个生命周期阶段执行-->
<phase>package</phase>
<!--执行别名-->
<id>build-agg</id>
<goals>
<!--插件目标-->
<goal>aggregate</goal>
</goals>
</execution>
</executions>
</plugin>
maven默认的打包插件默认是无法将依赖包打入到jar中的,springboot官方推出的打包插件可以实现将依赖包打入jar包。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
这里并没有指定这个插件要在哪个阶段执行哪个目标,那maven在打包的时候是如何确定的,答案是在parent.pom里,在父pom中的pluginManagment中执行了此插件的阶段和目标。