共计 2560 个字符,预计需要花费 7 分钟才能阅读完成。
Maven 的生命周期
Maven 的生命周期实质是我的项目构建的生命周期,比方在迭代过程中咱们须要清理我的项目环境、编译、测试、打包及部署。因为工作环境等起因,每个人的构建工作形式不同,有的以手工形式逐行命令执行,有的写了自动化脚本执行,这些形式不可重用,常常换个我的项目就须要从头再来。
Maven 的生命周期的初衷就是对这些我的项目的构建过程进行形象和对立。Maven 总结提供了高度欠缺的生命周期:革除(clean)、初始化(initialize)、编译(compile)、测试(test)、打包(package)、部署(deploy)等等。这一系列
与直觉不同,Maven 共有三套生命周期,每个生命周期蕴含了一系列阶段(Phase),同一个生命周期之内的阶段有程序依赖关系(调用前面的阶段会主动触发后面的阶段),而三套生命周期之间互相独立:当咱们指定其中一个生命周期的某个阶段时,不会触发另一个生命周期的执行,比方咱们执行 clean 生命周期不会触发 default。
- clean:革除阶段
- default
- site
clean
其中 clean 的生命周期较为简单,仅蕴含了 pre-clean、clean 和 post-clean,它用于革除我的项目环境,比方编译好的类、资源等。
default
default 的生命周期定义了我的项目真正构建时所须要执行的步骤,其蕴含的阶段如下(重点的几个阶段进行了标注):
- validate:
- initialize:
- generate-sources:生成源码阶段,像一些语法分析生成器,对外会提供一个语法形容文件,而后绑定在 generate-sources 阶段来生成具体的源代码(如 Calcite)。
- 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:将编译好的代码进行打包,最常见是打包成 jar 格局;
- pre-integration-test;
- integration-test;
- post-integration-test;
- verify;
- install:将打好的包装置到本地仓库;
- deploy。
site
建设和公布我的项目站点,Maven 可能基于 POM 文件蕴含的信息,主动生成一个敌对的站点。该生命周期蕴含了如下阶段:
- pre-site;
- site:生产我的项目站点文档;
- post-site;
- site-deploy:将生成的我的项目站点公布到服务器上。
应用命令行执行 Maven 的次要形式是指定调用的 Maven 的生命周期的某个 阶段,比方 mvn clean,指的并不是执行 clean 这整个生命周期,而是执行 clean 生命周期中的 clean 阶段,联合之前谈到的“同一个生命周期内阶段之间有程序关系”,因而理论执行的阶段为 pre-clean 和 clean。
再举个例子,平时咱们最罕用的 mvn clean package 命令,理论是别离指定执行 clean 生命周期的 clean 阶段和 default 生命周期的 package 阶段,因而最终执行的阶段为 clean 生命周期的 pre-clean 和 clean 以及 default 生命周期 validate 到 package 的所有阶段。
须要留神的是,后面提到,Maven 的生命周期其实是一个抽象概念,也就是没有任何实体行为,那咱们说的通过命令行指定执行 Maven 的某个阶段是什么意思呢?这里须要引入插件(Plugin)的概念。Maven 借鉴了设计模式中的模板办法(Template Method),定义了一套形象的生命周期阶段,而后每个阶段的具体动作由插件实现,当咱们说运行某个阶段,理论是运行该阶段的所有插件。模板办法模式的长处在于,它既提供了拓展点给子类来管制理论行为,又严格控制了整体的算法流程。
Maven 的插件机制
Maven 的每个生命周期阶段都能够绑定一个或多个插件,当运行以后生命周期阶段时,Maven 就会执行该生命周期阶段绑定的所有插件。但严格来说,Maven 的生命周期绑定的其实并不是插件,而是插件的指标(Goal)。集体认为指标是一个很好的设定,因为它将插件和 Maven 的生命周期彻底解耦了,每个插件能够有多个指标,每个指标绑定一个生命周期阶段,反过来,每个生命周期阶段也能够绑定多个插件指标,这些插件指标能够属于不同的插件。例如下图:
该图显示有两个 Maven 插件,其中 plugin1 有一个指标 goal,绑定了 clean 生命周期的 clean 阶段,plugin2 有两个插件 goal1 和 goal2,别离绑定了 clean 生命周期的 clean 阶段和 default 生命周期的 package 阶段。通过这个图咱们能够看出,插件自身和生命周期阶段是齐全解耦的,只有当具体指标绑定了该阶段,该阶段才会有执行实体。
当然,Maven 也为大多数生命周期阶段提供了默认插件,如为 compile 阶段绑定了 maven-compile-plugin:compile 指标,针对 test 阶段提供了 maven-surefire-plugin:test 等
咱们能够通过 Maven 命令指定运行某个阶段,而运行某个阶段等价于运行该阶段绑定的所有插件指标,所以很天然地,咱们该当也能够间接运行某个插件模板,Maven 执行具体插件指标的格局如下:mvn $plugin-prefix:$goal。: 右边是插件前缀而非插件名,具体法则是:个别插件的命名为 maven-xxx-plugin,而这里的插件前缀就是 xxx。比方执行 maven-compile-plugin:compile 时的命令为 mvn compile:compile,而执行 maven-surefire-plugin:test 的命令为 mvn surefire:test。
参考资料
- https://book.douban.com/subje…