转自 : http://www.infoq.com/cn/news/2011/04/xxb-maven-7-pluginhtml
咱们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,全部这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的。进一步说,每一个任务对应了一个插件目标(goal),每一个插件会有一个或者多个目标,例如maven-compiler-plugin的compile目标用来编译位于src/main/java/
目录下的主源码,testCompile目标用来编译位于src/test/java/
目录下的测试源码。java
用户能够经过两种方式调用Maven插件目标。第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与compile生命周期阶段绑定,所以命令mvn compile其实是先定位到compile这一辈子命周期阶段,而后再根据绑定关系调用maven-compiler-plugin的compile目标。第二种方式是直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。apache
认识上述Maven插件的基本概念能帮助你理解Maven的工做机制,不过要想更高效率地使用Maven,了解一些经常使用的插件仍是颇有必要的,这能够帮助你避免一不当心从新发明轮子。多年来Maven社区积累了大量的经验,并随之造成了一个成熟的插件生态圈。Maven官方有两个插件列表,第一个列表的GroupId为org.apache.maven.plugins,这里的插件最为成熟,具体地址为:http://maven.apache.org/plugins/index.html。第二个列表的GroupId为org.codehaus.mojo,这里的插件没有那么核心,但也有很多十分有用,其地址为:http://mojo.codehaus.org/plugins.html。并发
接下来笔者根据本身的经验介绍一些最经常使用的Maven插件,在不一样的环境下它们各自都有其出色的表现,熟练地使用它们能让你的平常构建工做事半功倍。框架
http://maven.apache.org/plugins/maven-antrun-plugin/maven
maven-antrun-plugin能让用户在Maven项目中运行Ant任务。用户能够直接在该插件的配置以Ant的方式编写Target,而后交给该插件的run目标去执行。在一些由Ant往Maven迁移的项目中,该插件尤为有用。此外当你发现须要编写一些自定义程度很高的任务,同时又以为Maven不够灵活时,也能够以Ant的方式实现之。maven-antrun-plugin的run目标一般与生命周期绑定运行。ide
http://maven.apache.org/archetype/maven-archetype-plugin/工具
Archtype指项目的骨架,Maven初学者最开始执行的Maven命令可能就是mvn archetype:generate,这实际上就是让maven-archetype-plugin生成一个很简单的项目骨架,帮助开发者快速上手。可能也有人看到一些文档写了mvn archetype:create,但实际上create目标已经被弃用了,取而代之的是generate目标,该目标使用交互式的方式提示用户输入必要的信息以建立项目,体验更好。maven-archetype-plugin还有一些其余目标帮助用户本身定义项目原型,例如你由一个产品须要交付给不少客户进行二次开发,你就能够为他们提供一个Archtype,帮助他们快速上手。测试
http://maven.apache.org/plugins/maven-assembly-plugin/spa
maven-assembly-plugin的用途是制做项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。maven-assembly-plugin支持各类主流的格式如zip、tar.gz、jar和war等,具体打包哪些文件是高度可控的,例如用户能够按文件级别的粒度、文件集级别的粒度、模块级别的粒度、以及依赖级别的粒度控制打包,此外,包含和排除配置也是支持的。maven-assembly-plugin要求用户使用一个名为assembly.xml
的元数据文件来表述打包,它的single目标能够直接在命令行调用,也能够被绑定至生命周期。
http://maven.apache.org/plugins/maven-dependency-plugin/
maven-dependency-plugin最大的用途是帮助分析项目依赖,dependency:list可以列出项目最终解析到的依赖列表,dependency:tree能进一步的描绘项目依赖树,dependency:analyze能够告诉你项目依赖潜在的问题,若是你有直接使用到的却未声明的依赖,该目标就会发出警告。maven-dependency-plugin还有不少目标帮助你操做依赖文件,例如dependency:copy-dependencies能将项目依赖从本地Maven仓库复制到某个特定的文件夹下面。
http://maven.apache.org/plugins/maven-enforcer-plugin/
在一个稍大一点的组织或团队中,你没法保证全部成员都熟悉Maven,那他们作一些比较愚蠢的事情就会变得很正常,例如给项目引入了外部的SNAPSHOT依赖而致使构建不稳定,使用了一个与你们不一致的Maven版本而常常抱怨构建出现诡异问题。maven-enforcer-plugin可以帮助你避免之类问题,它容许你建立一系列规则强制你们遵照,包括设定Java版本、设定Maven版本、禁止某些依赖、禁止SNAPSHOT依赖。只要在一个父POM配置规则,而后让你们继承,当规则遭到破坏的时候,Maven就会报错。除了标准的规则以外,你还能够扩展该插件,编写本身的规则。maven-enforcer-plugin的enforce目标负责检查规则,它默认绑定到生命周期的validate阶段。
http://maven.apache.org/plugins/maven-help-plugin/
maven-help-plugin是一个小巧的辅助工具,最简单的help:system能够打印全部可用的环境变量和Java系统属性。help:effective-pom和help:effective-settings最为有用,它们分别打印项目的有效POM和有效settings,有效POM是指合并了全部父POM(包括Super POM)后的XML,当你不肯定POM的某些信息从何而来时,就能够查看有效POM。有效settings同理,特别是当你发现本身配置的settings.xml没有生效时,就能够用help:effective-settings来验证。此外,maven-help-plugin的describe目标能够帮助你描述任何一个Maven插件的信息,还有all-profiles目标和active-profiles目标帮助查看项目的Profile。
http://maven.apache.org/plugins/maven-release-plugin/
maven-release-plugin的用途是帮助自动化项目版本发布,它依赖于POM中的SCM信息。release:prepare用来准备版本发布,具体的工做包括检查是否有未提交代码、检查是否有SNAPSHOT依赖、升级项目的SNAPSHOT版本至RELEASE版本、为项目打标签等等。release:perform则是签出标签中的RELEASE源码,构建并发布。版本发布是很是琐碎的工做,它涉及了各类检查,并且因为该工做仅仅是偶尔须要,所以手动操做很容易遗漏一些细节,maven-release-plugin让该工做变得很是快速简便,不易出错。maven-release-plugin的各类目标一般直接在命令行调用,由于版本发布显然不是平常构建生命周期的一部分。