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插件,只需要查询下即可
2. 调用maven插件的方法
2.1 将插件目标与生命周期阶段(lifecycle phase)绑定
第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已。
例如Maven默认将maven-compiler-plugin的compile目标与compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。
2.2 命令行指定要执行的插件目标。
第二种方式是直接在命令行指定要执行的插件目标。
例如:
- mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。
- 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的回答:
- What is an uber jar?
- 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只是在发布最终构件方便部署的时候使用。
实践建议:
- 代码原件打包成jar,采用jar plugin
- 打包需要包含一些自己内部实现的构件、资源文件,不包含一些通用、常用的构件。这样的打包需求交给assembly plugin
- 打包需要包含所有依赖,并且其中包含一些通用的,容易版本冲突的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自定义项目脚手架可以参考如下博文:
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
注意需要引入额外的依赖
参考资料:
- [maven] 常用插件解析](http://www.cnblogs.com/avivaye/p/5341341.html)
- Maven学习笔记(二)——常用插件配置详解