1. 介绍

无论是自己写代码,还是看一些开源的源码,都能看到大量maven插件的应用。本文这里对常用的maven插件做一些简单总结。该文章内容会不断完善。

maven插件官方文档来看,maven插件一般概括起来可以分为:

类别 说明
Core plugins Plugins corresponding to default core phases (ie. clean, compile). They may have multiple goals as well.
Packaging types/tools These plugins relate to packaging respective artifact types.
Reporting plugins Plugins which generate reports, are configured as reports in the POM and run under the site generation lifecycle.
Tools These are miscellaneous tools available through Maven by default.

现有的maven插件主要来自于maven官方和mojoHaus,如果遇到不认识的maven插件,只需要查询下即可

  1. maven插件官方文档
  2. mojoHaus maven插件文档

2. 调用maven插件的方法

2.1 将插件目标与生命周期阶段(lifecycle phase)绑定

第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已。

例如Maven默认将maven-compiler-plugin的compile目标与compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。

2.2 命令行指定要执行的插件目标。

第二种方式是直接在命令行指定要执行的插件目标。
例如:

  1. mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。
  2. mvn clean 等等

3. 核心插件

3.1 maven-resources-plugin

官方使用简介:maven-resources-plugin
为了使项目结构更为清晰,Maven区别对待Java代码文件和资源文件,maven-compiler-plugin用来编译Java代码,maven-resources-plugin则用来处理资源文件。
默认的主资源文件目录是src/main/resources,很多用户会需要添加额外的资源文件目录,这个时候就可以通过配置maven-resources-plugin来实现。
此外,资源文件过滤也是Maven的一大特性,你可以在资源文件中使用${propertyName}形式的Maven属性,然后配置maven-resources-plugin开启对资源文件的过滤,
之后就可以针对不同环境通过命令行或者Profile传入属性的值,以实现更为灵活的构建。

3.2 maven-surefire-plugin

官方使用简介:maven-surefire-plugin
可能是由于历史的原因,Maven 2/3中用于执行测试的插件不是maven-test-plugin,而是maven-surefire-plugin。
其实大部分时间内,只要你的测试类遵循通用的命令约定(以Test结尾、以TestCase结尾、或者以Test开头),就几乎不用知晓该插件的存在。
然而在当你想要跳过测试、排除某些测试类、或者使用一些TestNG特性的时候,了解maven-surefire-plugin的一些配置选项就很有用了。
例如 mvn test -Dtest=FooTest 这样一条命令的效果是仅运行FooTest测试类,这是通过控制maven-surefire-plugin的test参数实现的。

关于这个插件在很多开源项目中都有使用,主要是对maven的test stage做一些额外的处理,例如我想使用jmockit,我想启动多个线程运行单元测试,我想运行某些单元测试,某些单元测试我想排除掉,这些怎么做到呢?我们继续看吧。

参考应用例子:maven surefire plugin介绍

4. 打包相关插件

4.1 maven-source-plugin

官方使用简介:maven-source-plugin

该插件主要用于在打jar包时,把源代码也打成jar包

4.2 maven-jar-plugin

官方使用简介:maven-jar-plugin

在将项目打成jar包时,有时会需要将项目打成可以直接运行的jar包。 注意和assembly插件的区别。这个只能打包成jar,而且不能把其他关联的依赖也打包到jar中。主要用于将代码源文件打包成jar.

具体可以参考SW 问题:What are the differences between Maven Jar Plugin and Maven Assembly Plugin?

4.3 maven-shade-plugin

官方使用简介:maven-shade-plugin

这个shade plugin主要是把工程打包成一个"uber jar"(也叫做fat jar、super jar)。uber jar的解释可以看下SW的回答:

  1. What is an uber jar?
  2. What is the maven-shade-plugin used for, and why would you want to relocate java packages?

关于各类jar的区别可以参考回答:

PS: 这里注意区别下maven-assembly-plugin。assembly插件和shade插件都可以打包所有依赖的jar到一个single jar当中。但是assembly插件打包的时候不会对依赖做“shade”处理。假如你的工程叫做A,然后在工程B中使用了你的工程A。但是工程B还要引用工程C。但是工程C中依赖的一些jar和你A中依赖的jar有版本冲突,这就会出问题。使用 “shade”处理,也就是打包的时候对依赖的jar做重命名避免这种包冲突问题。此外shade插件在打包uber jar的时候提供更多控制。

此外,上传到repository的时候,千万别上传这种uber jar。一般uber jar只是在发布最终构件方便部署的时候使用。

实践建议

  1. 代码原件打包成jar,采用jar plugin
  2. 打包需要包含一些自己内部实现的构件、资源文件,不包含一些通用、常用的构件。这样的打包需求交给assembly plugin
  3. 打包需要包含所有依赖,并且其中包含一些通用的,容易版本冲突的jar,需要作为最终部署、发布用,可以用shade plugin。

5. report相关插件

5.1 maven-javadoc-plugin

官方使用简介: maven-javadoc-plugin

为当前工程生成javadoc

5.2 maven-checkstyle-plugin

官方使用简介: maven-javadoc-plugin

为当前工程做格式检查

6.工具类插件

6.1 maven-archetype-plugin

官方使用简介:maven-checkstyle-plugin

Archtype指项目的骨架,Maven初学者最开始执行的Maven命令可能就是mvn archetype:generate,这实际上就是让maven-archetype-plugin生成一个很简单的项目骨架,帮助开发者快速上手。

maven-archetype-plugin还有一些其他目标帮助用户自己定义项目原型,例如你由一个产品需要交付给很多客户进行二次开发,你就可以为他们提供一个Archtype,帮助他们快速上手。

关于在idea自定义项目脚手架可以参考如下博文:

  1. 自定义项目脚手架- Maven Archetypes
  2. 使用maven3 创建自定义的archetype

6.2 maven-assembly-plugin

官方使用简介:maven-assembly-plugin

maven-assembly-plugin的用途是制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。
maven-assembly-plugin支持各种主流的格式如zip、tar.gz、jar和war等,具体打包哪些文件是高度可控的。
例如用户可以按文件级别的粒度、文件集级别的粒度、模块级别的粒度、以及依赖级别的粒度控制打包,此外,包含和排除配置也是支持的。
maven-assembly-plugin要求用户使用一个名为assembly.xml的元数据文件来表述打包,它的single目标可以直接在命令行调用,也可以被绑定至生命周期。

这里给一个参考的使用例子:maven assembly plugin使用

6.3 maven-dependency-plugin

官方使用简介:maven-dependency-plugin

maven-dependency-plugin最大的用途是帮助分析项目依赖
dependency:list能够列出项目最终解析到的依赖列表
dependency:tree能进一步的描绘项目依赖树
dependency:analyze可以告诉你项目依赖潜在的问题
如果你有直接使用到的却未声明的依赖,该目标就会发出警告。
maven-dependency-plugin还有很多目标帮助你操作依赖文件,例如dependency:copy-dependencies能将项目依赖从本地Maven仓库复制到某个特定的文件夹下面。

6.4 maven-enforcer-plugin

官方使用简介: maven-enforcer-plugin

在一个稍大一点的组织或团队中,你无法保证所有成员都熟悉Maven,那他们做一些比较愚蠢的事情就会变得很正常。
例如给项目引入了外部的SNAPSHOT依赖而导致构建不稳定,使用了一个与大家不一致的Maven版本而经常抱怨构建出现诡异问题。
maven-enforcer-plugin能够帮助你避免之类问题,它允许你创建一系列规则强制大家遵守,包括设定Java版本、设定Maven版本、禁止某些依赖、禁止SNAPSHOT依赖。
只要在一个父POM配置规则,然后让大家继承,当规则遭到破坏的时候,Maven就会报错。
除了标准的规则之外,你还可以扩展该插件,编写自己的规则。maven-enforcer-plugin的enforce目标负责检查规则,它默认绑定到生命周期的validate阶段。

6.5 maven-help-plugin

官方使用简介: 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。

6.6 maven-release-plugin

官方使用简介: maven-release-plugin

maven-release-plugin的用途是帮助自动化项目版本发布,它依赖于POM中的SCM信息。
release:prepare用来准备版本发布,具体的工作包括检查是否有未提交代码、检查是否有SNAPSHOT依赖、升级项目的SNAPSHOT版本至RELEASE版本、为项目打标签等等。
release:perform则是签出标签中的RELEASE源码,构建并发布。版本发布是非常琐碎的工作,它涉及了各种检查,而且由于该工作仅仅是偶尔需要,因此手动操作很容易遗漏一些细节。
maven-release-plugin让该工作变得非常快速简便,不易出错。maven-release-plugin的各种目标通常直接在命令行调用,因为版本发布显然不是日常构建生命周期的一部分。

6.7 findbugs-maven-plugin

官方使用简介: findbugs-maven-plugin

注意需要引入额外的依赖

参考资料:

  1. [maven] 常用插件解析](http://www.cnblogs.com/avivaye/p/5341341.html)
  2. Maven学习笔记(二)——常用插件配置详解