【Maven系列2】生命周期与插件
讲解Maven的生命周期和插件以及常用的命令。Maven生命周期三套生命周期Maven 的生命周期并不是一个整体Maven 拥有三套相互独立的生命周期clean项目清理的处理default(或 build)项目部署的处理site项目站点文档创建的处理三套生命周期本身是相互独立的用户可以仅调用 clean 生命周期的某个阶段或者仅仅调用 default 生命周期的某个阶段而不会对其他生命周期产生任何影响。例如当用户调用 clean 生命周期的 clean 阶段的时候不会触发 default 生命周期的任何阶段反之亦然。注所以一般的打包命令都是 clean package xxxxx先 clean 再 package就是因为 clean 和 package 是在两个不同的生命周期里面。clean生命周期当我们执行 mvn post-clean 命令时Maven 调用 clean 生命周期它包含以下阶段pre-clean执行一些需要在clean之前完成的工作clean移除所有上一次构建生成的文件post-clean执行一些需要在clean之后立刻完成的工作当调用 pre-clean 时只有 pre-clean 阶段得以执行当调用 clean 的时候pre-clean和clean阶段会得以顺序执行以此类推。这是因为每个生命周期包含一些阶段(phase)这些阶段是有顺序的并且后面的阶段依赖于前面的阶段。default生命周期重点步骤如下表这个需要掌握default的23个阶段仅了解即可在开发环境中使用下面的命令去构建、安装工程到本地仓库mvn install这个命令在执行 install 阶段前按顺序执行了 default 生命周期的阶段 validatecompilepackage等等我们只需要调用最后一个阶段如这里是 install。site生命周期pre-site 执行一些在生成项目站点之前需要完成的工作。site 生成项目站点文档。post-site 执行一些在生成项目站点之后需要完成的工作。site-deploy 将生成的项目站点发布到服务器上。这个没用过后面如果需要用的话我再试试。Maven插件插件介绍Maven 三套生命周期定义各个阶段不做任何实际工作实际工作都是由插件来完成的每个生命周期阶段都是由插件的目标来完成。在 pom 文件中声明如下打包源码文件插件build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-source-plugin/artifactId version2.1.1/version executions execution idattach-sources/id phaseverify/phase goals goaljar-no-fork/goal /goals /execution /executions /plugin /plugins /buildMaven 实际上是一个依赖插件执行的框架每个任务实际上是由插件完成。Maven 插件通常被用来创建 jar 文件创建 war 文件编译代码文件代码单元测试创建工程文档创建工程报告插件目标一个插件有可能有多个功能、每个功能就是一个目标。比如 maven-dependency-plugin 有十多个目标每个目标对应了一个功能。插件的目标为 dependency:analyze、dependency:tree和dependency:list。通用写法冒号前面是插件前缀冒号后面是插件的目标。比如 compiler:compile。插件绑定内置绑定为实现快速构建Maven 有一套内置的插件绑定。三套生命周期的插件绑定具体如下其实是各个生命周期阶段与插件的目标的绑定。其中 default 生命周期的构建方式会其打包类型有关、打包类型在POM中 packaging 指定。一般有 jar、war 两种类型。下面是默认绑定插件与生命周期关系图自定义绑定自定义绑定允许我们自己掌控插件目标与生命周期的结合.以生成项目主代码的源码 jar 为例。使用到的插件和它的目标为maven-source-plugin:jar-no-fork。将其绑定到 default 生命周期阶段 verify 上可以任意指定三套生命周期的任意阶段。build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-source-plugin/artifactId version2.1.1/version executions execution idattach-sources/id phaseverify/phase !-- 指定作用在生命周期的哪个阶段 -- goals goaljar-no-fork/goal !-- 指定执行绑定插件的哪些目标 -- /goals /execution /executions /plugin /plugins /build举个栗子这个是项目中的示例plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-source-plugin/artifactId version3.0.1/version executions execution idattach-sources/id phasepackage/phase goals goaljar-no-fork/goal /goals /execution /executions /plugin plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-surefire-plugin/artifactId configuration !-- 不执行单元测试 -- skiptrue/skip /configuration /plugin plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-compiler-plugin/artifactId version3.8.0/version configuration encoding${project.build.sourceEncoding}/encoding source${java.version}/source target${java.version}/target testSource${java.version}/testSource testTarget${java.version}/testTarget /configuration /plugin /pluginsmaven-source-plugin是对Maven工程的源码进行打jar包的插件。但是我试过我将它去掉一样可以打包成功应该是用的Maven的默认插件。maven-surefire-plugin是maven里执行测试用例的插件示例我们是跳过了单元测试maven-compiler-plugin用于指定JDK的编译版本插件在pom.xml的属性配置文件中我们指定的是1.8。