最新重新回过头看了一下maven,对它的生命周期有新的理解,以前只会用,或者说出问题后百度一下,没有从原理上理解maven的运行机制。
概念上分为以下几个:
lifecycle——>phase——>plugin——>goal
There are three built-in build lifecycles: default, clean and site. The default lifecycle handles your project deployment, the clean lifecycle handles project cleaning, while the site lifecycle handles the creation of your project’s web site.
翻译过来就是maven有三个生命周期:default, clean , site.
官方说明
<phases>
<phase>validatephase>
<phase>initializephase>
<phase>generate-sourcesphase>
<phase>process-sourcesphase>
<phase>generate-resourcesphase>
<phase>process-resourcesphase>
<phase>compilephase>
<phase>process-classesphase>
<phase>generate-test-sourcesphase>
<phase>process-test-sourcesphase>
<phase>generate-test-resourcesphase>
<phase>process-test-resourcesphase>
<phase>test-compilephase>
<phase>process-test-classesphase>
<phase>testphase>
<phase>prepare-packagephase>
<phase>packagephase>
<phase>pre-integration-testphase>
<phase>integration-testphase>
<phase>post-integration-testphase>
<phase>verifyphase>
<phase>installphase>
<phase>deployphase>
phases>
<phases>
<phase>pre-cleanphase>
<phase>cleanphase>
<phase>post-cleanphase>
phases>
<default-phases>
<clean>
org.apache.maven.plugins:maven-clean-plugin:3.2.0:clean
clean>
default-phases>
<phases>
<phase>pre-sitephase>
<phase>sitephase>
<phase>post-sitephase>
<phase>site-deployphase>
phases>
<default-phases>
<site>
org.apache.maven.plugins:maven-site-plugin:3.12.1:site
site>
<site-deploy>
org.apache.maven.plugins:maven-site-plugin:3.12.1:deploy
site-deploy>
default-phases>
以前一直好奇,为啥随便搞一个maven项目都有自带的插件,并且有时候插件还不一样,今天终于搞懂了,其实默认的插件和packaging的类型有关,另外clean和site插件是任何项目都默认就有的。
比如下图有两个maven项目,插件不一样,并且我在pom中没有配置任何maven插件
原因是maven会根据pom中packaging的类型给项目设置默认绑定的插件,点击查看官方文档
packaging类型以后pom,jar,war,ejb,maven-plugin,rar,ear等等,这里只列出最常用的pom和jar,完整版请看官网文档
<phases>
<install>
org.apache.maven.plugins:maven-install-plugin:3.1.0:install
install>
<deploy>
org.apache.maven.plugins:maven-deploy-plugin:3.1.0:deploy
deploy>
phases>
<phases>
<process-resources>
org.apache.maven.plugins:maven-resources-plugin:3.3.0:resources
process-resources>
<compile>
org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile
compile>
<process-test-resources>
org.apache.maven.plugins:maven-resources-plugin:3.3.0:testResources
process-test-resources>
<test-compile>
org.apache.maven.plugins:maven-compiler-plugin:3.10.1:testCompile
test-compile>
<test>
org.apache.maven.plugins:maven-surefire-plugin:3.0.0:test
test>
<package>
org.apache.maven.plugins:maven-jar-plugin:3.3.0:jar
package>
<install>
org.apache.maven.plugins:maven-install-plugin:3.1.0:install
install>
<deploy>
org.apache.maven.plugins:maven-deploy-plugin:3.1.0:deploy
deploy>
phases>
maven有三条生命周期线,clean/build/site,每次执行命令只会执行一条生命线,比如执行mvn clean
,就只会执行clean生命周期线上绑定的 一些插件(具体来说是插件上的goal),并不会执行到build和site生命周期(mvn clean install
这种写法暂且不考虑)。
就以mvn clean
为例来讲解maven执行的原理。此命令执行,会自动识别为clean那条生命周期的clean阶段(phase),然后我们知道clean生命周期实际上包含三个phase,分别为pre-clean,clean,post-clean,然后程序会按照这个顺序依次去扫描每个phase绑定的插件然后
再去执行设定好的goal。第一步运行到pre-clean阶段,会去pom.xml扫描有没有插件绑定到此phase,如果有则执行其设置好的goal,比如有如下配置(插件是我瞎配置的,肯定有问题,此处就仅仅举例说明maven执行流程),当执行到pre-clean的阶段,发现有一个插件echo-plugin绑定在这个phase,就会执行这个插件对应的goal,就是那个echo,然后继续clean的第二个阶段发现绑定的有个log-plugin插件,然后就会执行绑定的goal就是那个log,然后继续执行到第三个阶段post-clean发现没有插件绑定,就啥都不做,程序结束了。
<plugin>
<groupId>com.chensinogroupId>
<artifactId>echo-pluginartifactId>
<version>x.x.xversion>
<configuration>
configuration>
<executions>
<execution>
<phase>pre-cleanphase>
<goals>
<goal>echogoal>
goals>
execution>
executions>
plugin>
<plugin>
<groupId>com.chensinogroupId>
<artifactId>log-pluginartifactId>
<version>x.x.xversion>
<configuration>
configuration>
<executions>
<execution>
<phase>cleanphase>
<goals>
<goal>loggoal>
goals>
execution>
executions>
plugin>
上面虽然是用clean生命周期进行举例,但是最重要的是build生命周期,原理都一样,无非build周期的phase多了一些而已。
以前一直对maven的生命周期理解的很模糊,对clean/build/site三条生命周期稀里糊涂的,可能是被mvn clean install
类似这种连写的方式误导了,最近有心得理解。
其实字面意思很明显了,“生命周期”,什么是“生命周期”,其实就是一条完整的流程,或者叫流水线,每条流水线上已经按照顺序定义好了phase。那clean/build/site其实就是三条独立的流水线。
每次执行一条生命周期时,其实就是按照某一个生命周期上已经绑定好的phase进行顺序扫描,扫描到有插件绑定在这个phase上时,就去执行配置好的goal,仅此而已。
另外补充一下,在idea插件中,有个lifecycle,显示的其实是phase,在使用spring-boot-maven-plugin插件时,发现并没有配置phase,其实插件默认绑定在了package极端
spring-boot-maven-plugin是不是默认绑定在package阶段?
是的,Spring Boot Maven插件默认绑定在Maven的package阶段,它会在执行该阶段时自动运行。在默认的情况下,spring-boot-maven-plugin会使用repackage目标来创建可执行的jar或war文件。
以下是Spring Boot官方文档对repackage目标的说明:
repackage 目标是 spring-boot-maven-plugin 的一个目标,它用于重新打包当前的JAR或WAR文件。在处理普通的JAR或WAR文件时,这通常会将依赖项复制到 BOOT-INF/lib 目录中,并将所有类文件复制到 BOOT-INF/classes 目录中。同时,此目标还重命名了原始的JAR或WAR文件,以 *-original.jar 或 *-original.war 命名,并创建一个新的可执行的JAR或WAR文件,以便在命令行上运行应用程序。
因此,在大多数情况下,您不需要在 pom.xml 文件中为 spring-boot-maven-plugin 插件指定任何额外的配置,它将在默认的package阶段正常工作。只有在您需要更改默认行为时,才需要根据需要更改 spring-boot-maven-plugin 插件的配置或执行计划。
最后再画一个图,图示用的default生命周期进行说明。