Maven实战(八)——经常使用Maven插件介绍(下)

咱们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,全部这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的。进一步说,每一个任务对应了一个插件目标(goal),每一个插件会有一个或者多个目标,例如maven- compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码。html

用户能够经过两种方式调用Maven插件目标。第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与 compile生命周期阶段绑定,所以命令mvn compile其实是先定位到compile这一辈子命周期阶段,而后再根据绑定关系调用maven-compiler-plugin的compile目标。第二种方式是直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。java

认识上述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.htmlapache

接下来笔者根据本身的经验介绍一些最经常使用的Maven插件,在不一样的环境下它们各自都有其出色的表现,熟练地使用它们能让你的平常构建工做事半功倍。本文为下半部分。(上半部份内容参见Maven实战(七)——经常使用Maven插件介绍(上) 浏览器

maven-resources-plugin

http://maven.apache.org/plugins/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传入属性的值,以实现更为灵活的构建。eclipse

maven-surefire-plugin

http://maven.apache.org/plugins/maven-surefire-plugin/maven

多是因为历史的缘由,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参数实现的。工具

build-helper-maven-plugin

http://mojo.codehaus.org/build-helper-maven-plugin/测试

Maven默认只容许指定一个主Java代码目录和一个测试Java代码目录,虽然这实际上是个应当尽可能遵照的约定,但偶尔你仍是会但愿可以指定多个 源码目录(例如为了应对遗留项目),build-helper-maven-plugin的add-source目标就是服务于这个目的,一般它被绑定到 默认生命周期的generate-sources阶段以添加额外的源码目录。须要强调的是,这种作法仍是不推荐的,由于它破坏了 Maven的约定,并且可能会遇到其余严格遵照约定的插件工具没法正确识别额外的源码目录。网站

build-helper-maven-plugin的另外一个很是有用的目标是attach-artifact,使用该目标你能够以classifier的形式选取部分项目文件生成附属构件,并同时install到本地仓库,也能够deploy到远程仓库。

exec-maven-plugin

http://mojo.codehaus.org/exec-maven-plugin/

exec-maven-plugin很好理解,顾名思义,它能让你运行任何本地的系统程序,在某些特定状况下,运行一个Maven外部的程序可能就是最简单的问题解决方案,这就是exec:exec的 用途,固然,该插件还容许你配置相关的程序运行参数。除了exec目标以外,exec-maven-plugin还提供了一个java目标,该目标要求你 提供一个mainClass参数,而后它可以利用当前项目的依赖做为classpath,在同一个JVM中运行该mainClass。有时候,为了简单的 演示一个命令行Java程序,你能够在POM中配置好exec-maven-plugin的相关运行参数,而后直接在命令运行 mvn exec:java 以查看运行效果。

jetty-maven-plugin

http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin

在进行Web开发的时候,打开浏览器对应用进行手动的测试几乎是没法避免的,这种测试方法一般就是将项目打包成war文件,而后部署到Web容器 中,再启动容器进行验证,这显然十分耗时。为了帮助开发者节省时间,jetty-maven-plugin应运而生,它彻底兼容 Maven项目的目录结构,可以周期性地检查源文件,一旦发现变动后自动更新到内置的Jetty Web容器中。作一些基本配置后(例如Web应用的contextPath和自动扫描变动的时间间隔),你只要执行 mvn jetty:run ,而后在IDE中修改代码,代码经IDE自动编译后产生变动,再由jetty-maven-plugin侦测到后更新至Jetty容器,这时你就能够直接 测试Web页面了。须要注意的是,jetty-maven-plugin并非宿主于Apache或Codehaus的官方插件,所以使用的时候须要额外 的配置settings.xml的pluginGroups元素,将org.mortbay.jetty这个pluginGroup加入。

versions-maven-plugin

http://mojo.codehaus.org/versions-maven-plugin/

不少Maven用户遇到过这样一个问题,当项目包含大量模块的时候,为他们集体更新版本就变成一件烦人的事情,到底有没有自动化工具能帮助完成这件 事情呢?(固然你可使用sed之类的文本操做工具,不过不在本文讨论范围)答案是确定的,versions-maven- plugin提供了不少目标帮助你管理Maven项目的各类版本信息。例如最经常使用的,命令 mvn versions:set -DnewVersion=1.1-SNAPSHOT 就能帮助你把全部模块的版本更新到1.1-SNAPSHOT。该插件还提供了其余一些颇有用的目标,display-dependency- updates能告诉你项目依赖有哪些可用的更新;相似的display-plugin-updates能告诉你可用的插件更新;而后use- latest-versions能自动帮你将全部依赖升级到最新版本。最后,若是你对所作的更改满意,则可使用 mvn versions:commit 提交,不满意的话也可使用 mvn versions:revert 进行撤销。

小结

本文介绍了一些最经常使用的Maven插件,这里指的“经常使用”是指常常须要进行配置的插件,事实上咱们用Maven的时候不少其它插件也是必须的,例如 默认的编译插件maven-compiler-plugin和默认的打包插件maven-jar-plugin,但由于不多须要对它们进行配置,所以不在 本文讨论范围。了解经常使用的Maven插件能帮助你事倍功半地完成项目构建任务,反之你就可能会由于常常遇到一些难以解决的问题而感到沮丧。本文介绍的插件 基本能覆盖大部分Maven用户的平常使用须要,若是你真有很是特殊的需求,自行编写一个Maven插件也不是难事,更况且还有这么多开放源代码的插件供 你参考。

本文的这个插件列表并非一个完整列表,读者有兴趣的话也能够去仔细浏览一下Apache和Codehaus Mojo的Maven插件列表,以的到一个更为全面的认识。最后,在线的Maven仓库搜索引擎如http://search.maven.org/也能帮助你快速找到本身感兴趣的Maven插件。

关于做者

许晓斌(Juven Xu),国内社区公认的Maven技术专家、Maven中文用户组创始人、Maven技术的先驱和积极推进者,著有《Maven实战》一 书。对Maven有深入的认识,实战经验丰富,不只撰写了大量关于Maven的技术文章,并且还翻译了开源书籍《Maven权威指南》,对Maven技术 在国内的普及和发展作出了很大的贡献。就任于Maven之父的公司,负责维护Maven中央仓库,是Maven仓库管理器Nexus(著名开源软件)的核 心开发者之一,曾屡次受邀到淘宝等大型企业开展Maven方面的培训。此外,他仍是开源技术的积极倡导者和推进者,擅长Java开发和敏捷开发实践。他的 我的网站是:http://www.juvenxu.com

相关文章
相关标签/搜索