当前位置: 首页 > 后端技术 > Java

【Maven】生命周期与插件机制

时间:2023-04-01 15:58:01 Java

Maven生命周期Maven生命周期的本质是项目构建的生命周期。比如在迭代过程中,我们需要清理项目环境,编译、测试、打包、部署。由于工作环境等原因,每个人的施工工作都不一样。有的手动逐行执行命令,有的编写自动化脚本执行。这些方法不能重复使用,经常需要在更改项目时从头开始。Maven生命周期的初衷就是将这些项目的构建过程进行抽象和统一。Maven总结提供了一个高度完整的生命周期:clean、initialize、compile、test、package、deploy等,这个系列跟直觉不一样。Maven有三组生命周期,每个生命周期包含一系列的阶段(Phase),同一个生命周期内的阶段具有顺序依赖(调用后续阶段会自动触发前一个阶段),而这三组生命周期相互独立:当我们指定其中一个生命周期的某个阶段时,不会触发另一个生命周期的执行,比如我们执行clean生命周期时默认不会触发。clean:清理阶段defaultsiteclean,这里clean的生命周期比较简单,只包括pre-clean、clean和post-clean,用来清理项目环境,比如编译类,资源等。生命周期ofdefaultdefault定义了在实际构建项目时需要执行的步骤。包括以下几个阶段(关键阶段已标注):validate:initialize:generate-sources:生成源码阶段,像一些语法分析生成器,会对外提供一个语法描述文件,然后在generate-sources阶段进行绑定生成特定的源代码(如方解石)。过程来源;生成资源;过程资源;编译:编译项目的主要源代码;过程类;生成测试源;过程测试源;生成测试资源;处理测试资源;test-compile:编译测试项目的主要源代码;过程测试类;测试;准备包裹;package:将编译好的代码打包,最常见的是jar格式;预集成测试;集成测试;后集成测试;核实;install:安装包到本地仓库;部署。site要构建和发布项目站点,Maven可以根据POM文件中包含的信息自动生成一个友好的站点。生命周期包括以下阶段:前期;site:制作项目现场文件;后站;site-deploy:将生成的项目站点发布到服务器。使用命令行执行Maven的主要方式是指定调用的Maven生命周期的某个阶段,比如mvnclean,不是指执行clean的整个生命周期,而是执行清洁生命周期中的清洁阶段。结合之前讨论的“同一个生命周期中的阶段之间存在顺序关系”,所以实际执行的阶段是pre-clean和clean。再举个例子,我们平时最常使用的mvncleanpackage命令其实指定了clean生命周期的clean阶段和default生命周期的package阶段的执行,所以最后的执行阶段就是pre-clean和cleanofclean生命周期和默认生命周期验证包的所有阶段。需要注意的是,前面说到Maven的生命周期其实是一个抽象的概念,即没有物理行为,那么我们通过命令行指定Maven执行的某个阶段是什么意思呢?这里需要引入Plugin的概念。Maven借鉴了设计模式中的模板方法(TemplateMethod),定义了一组抽象的生命周期阶段,然后通过插件实现每个阶段的具体动作。当我们说我们运行某个阶段时,实际上我们运行了那个阶段插件中的所有阶段。模板方法模式的优点在于,它不仅为子类提供了扩展点来控制实际行为,而且对整个算法过程也进行了严格的控制。Maven的插件机制Maven的每个生命周期阶段都可以绑定一个或多个插件。当运行当前生命周期阶段时,Maven会执行该生命周期阶段绑定的所有插件。但严格来说,Maven的生命周期其实并不是和插件绑定的,而是插件的目标(Goal)。我个人认为目标设置的很好,因为它完全解耦了插件和Maven的生命周期。每个插件可以有多个目标,每个目标都绑定到一个生命周期阶段。反过来,每个生命周期的一个周期阶段也可以绑定多个插件目标,这些目标可以属于不同的插件。例如下图:这张图显示有两个Maven插件,其中plugin1有一个goal目标,绑定到clean生命周期的clean阶段,plugin2有两个插件goal1和goal2,分别是绑定到清洁生命周期的清洁阶段和清洁阶段。默认生命周期的包阶段。从这张图我们可以看出,插件本身和生命周期阶段是完全解耦的,只有特定的target绑定到这个阶段,这个阶段才会有执行实体。当然Maven也为大部分生命周期阶段提供了默认的插件,比如为编译阶段绑定maven-compile-plugin:compile目标,为测试阶段提供maven-surefire-plugin:test等,我们可以指定通过Maven命令Runningasomestage,运行了某个stage就相当于运行了这个stage绑定的所有插件目标,那么我们自然也应该可以直接运行某个插件模板。Maven执行具体插件目标的格式如下:mvn$plugin-prefix:$goal。:左边是插件前缀而不是插件名称。具体规则是:一般插件命名为maven-xxx-plugin,这里的插件前缀为xxx。比如执行maven-compile-plugin:compile的命令是mvncompile:compile,而执行maven-surefire-plugin:test的命令是mvnsurefire:test。参考资料https://book.douban.com/subje...