文章目录
生命周期
Maven有三套相互独立的生命周期,分别是clean、default 和 site。clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site生命周期的目的是建立项目站点。
每个生命周期包含一些阶段(phase),这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和maven最直接的交互方式就是调用这些生命周期阶段。
如上图我们在mvn命令中也说了,其执行运行的阶段说明,这里再以clean生命周期为例,它包含的阶段有:pre-clean,clean和post-clean。
- 当用户调用pre-clean的时候,只有pre-clean阶段得以执行;
- 当用户调用clean的时候,pre-clean和clean阶段会得以顺序执行;
- 当用户调用post-clean的时候,pre-clean,clean和post-clean会得以顺序执行。
较之于生命周期阶段的前后依赖关系,三套生命周期本身是相互独立的,用户可以仅仅调用clean生命周期的某个阶段,或者仅仅利用调用default生命周期的某个阶段,而不会对其它生命周期产生任何影响。
例如,当用户调用clean生命周期的clean阶段的时候,不会触发default生命周期的任何阶段,反之亦然。当用户调用default生命周期的compile阶段的时候,也不会触发clean生命周期的任何阶段。
上图中我们提到过maven只定义生命周期,具体的执行交由plugin插件来完成,所以插件plugin是绑定到生命周期,承担实际功能的组件。mvn运行时,自动关联插件来运行。
下图是maven默认的各阶段对应的插件列表,展示了生命周期与插件的相互绑定关系
生命周期 | 生命周期阶段 | 插件 | 执行任务 |
---|---|---|---|
clean | pre-clean | 执行一些清理前需要完成的工作 | |
clean | maven-clean-plugin:clean | 删除项目的输出目录,即清理上一次构建生成的文件 | |
post-clean | 执行一些清理后需要完成的工作 | ||
default | process-resources | maven-resources-plugin:resources | 复制主资源文件至主输出目录 |
compile | maven-compiler-plugin:compile | 编译主代码至主输出目录 | |
process-test-resources | maven-resources-plugin:testResources | 复制测试资源文件至测试输出目录 | |
test-compile | maven-compiler-plugin:testCompile | 编译测试代码至测试输出目录 | |
test | maven-surefire-plugin:test | 执行测试用例 | |
package | maven-jar-plugin:jar(ejb:ejb jar:jar rar:rar war:war) | 创建项目jar包 | |
install | maven-install-plugin:install | 将项目输出构件安装到本地仓库 | |
deploy | maven-deploy-plugin:deploy | 将项目输出构件部署到远程仓库 | |
site | pre-site | 执行一些在生成项目站点之前需要完成的工作 | |
site | maven-site-plugin:site | 生成项目站点文档 | |
post-site | 执行一些在生成项目站点后需要完成的工作 | ||
site-deploy | maven-site-plugin:deploy | 将生成的项目站点发布到服务器上 |
插件开发
清楚了上述的Maven的生命周期与插件的关系后,我们自己也可以自定义插件,来扩展maven的功能,首先我们需要maven插件开发所需的插件,如下:
<!-- https://mvnrepository.com/artifact/org.apache.maven/maven-plugin-api -->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugin-tools/maven-plugin-annotations -->
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
然后新建一个maven项目中,引入上述的依赖,另外需要注意的是,pom.xml文件的<packaging>
类型,如下:
PS:为了方便代码管理,我们将插件模块和测试模块放在了同一个父项目之下,当然也可以不作为子项目,分为两个maven项目也可。
(该父项目是一个普通的maven项目,之前测试中发现若父项目是一个SpringBoot项目时,在添加maven-plugin</packaging>插件项目后,maven打包安装及测试时,虽然都没有问题,不过就是在打包完成时IDEA会闪退重启,改为继承普通maven父项目后,该问题消失)
然后就可以创建一个类使其继承AbstractMojo
类,在其中就可以实现相关的功能,这里我们打印一行简单的日志来进行测试,如下:
然后就可以执行mvn clean install
将其安装到本地仓库中,就可以来执行上述插件了,如下:
当然在MyPlugin插件方法中,我们设置了参数,这里执行也是可以传入参数的,如下:
经过上述测试,发现自定义的插件是可以正常使用的,那么我们就来在另外一个demo模块项目中进行使用,这里我们需要在demo项目的pom.xml
文件进行配置,并且需要关联相关的Maven生命周期,如下:
如上图我们绑定的是Maven的default周期中的compile
阶段,所以只要在指定default周期中compile阶段及其之后的命令,该插件就会被执行。
当然在这使用,也是可以指定其参数的,如下: