常用maven插件介绍(采集)

优采云 发布时间: 2020-08-14 22:53

  我们都晓得Maven本质上是一个插件框架,它的核心并不执行任何具体的建立任务,所有那些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或则多个目标,例如maven- compiler-plugin的compile目标拿来编译坐落src/main/java/目录下的主源码,testCompile目标拿来编译坐落src/test/java/目录下的测试源码。

  用户可以通过两种方法调用Maven插件目标。第一种方法是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与 compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再按照绑定关系调用maven-compiler-plugin的compile目标。第二种方法是直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带引号的调用方法与生命周期无关。

  认识上述Maven插件的基本概念能帮助你理解Maven的工作机制,不过要想更高效率地使用Maven,了解一些常用的插件还是太有必要的,这可 以帮助你防止一不小心重新发明轮子。多年来Maven社区积累了大量的经验,并急剧产生了一个成熟的插件生态圈。Maven官方有两个插件列表,第一个列 表的GroupId为org.apache.maven.plugins,这里的插件最为成熟,具体地址为:。第二个列表的GroupId为org.codehaus.mojo,这里的插件没有这么核心,但也有不少非常有用,其地址为:。

  接下来笔者按照自己的经验介绍一些最常用的Maven插件,在不同的环境下它们各自都有其出众的表现,熟练地使用它们能使你的日常建立工作事半功倍。

  maven-antrun-plugin

  maven-antrun-plugin能使用户在Maven项目中运行Ant任务。用户可以直接在该插件的配置以Ant的形式编撰Target, 然后交给该插件的run目标去执行。在一些由Ant往Maven迁移的项目中,该插件尤其有用。此外当你发觉须要编撰一些自定义程度很高的任务,同时又觉 得Maven不够灵活时,也可以以Ant的形式实现之。maven-antrun-plugin的run目标一般与生命周期绑定运行。

  maven-archetype-plugin

  Archtype指项目的骨架,Maven初学者最开始执行的Maven命令可能就是mvn archetype:generate,这实际上就是使maven-archetype-plugin生成一个很简单的项目骨架,帮助开发者快速上手。可能也有人听到一些文档写了mvn archetype:create, 但实际上create目标早已被弃用了,取而代之的是generate目标,该目标使用交互式的方法提示用户输入必要的信息以创建项目,体验更好。 maven-archetype-plugin还有一些其他目标帮助用户自己定义项目原型,例如你由一个产品须要交付给好多顾客进行二次开发,你就可以为 他们提供一个Archtype,帮助她们快速上手。

  maven-assembly-plugin

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

  maven-dependency-plugin

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

  maven-enforcer-plugin

  在一个稍大一点的组织或团队中,你没法保证所有成员都熟悉Maven,那她们做一些比较可笑的事情都会显得很正常,例如给项目引入了外部的 SNAPSHOT依赖而造成建立不稳定,使用了一个与你们不一致的Maven版本而时常埋怨建立出现奇特问题。maven-enforcer- plugin就能帮助你防止之类问题,它容许你创建一系列规则强制你们遵循,包括设定Java版本、设定Maven版本、禁止个别依赖、禁止 SNAPSHOT依赖。只要在一个父POM配置规则,然后使你们承继,当规则遭受破坏的时侯,Maven都会报错。除了标准的规则之外,你还可以扩充该插 件,编写自己的规则。maven-enforcer-plugin的enforce目标负责检测规则,它默认绑定到生命周期的validate阶段。

  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。

  maven-release-plugin

  maven-release-plugin的用途是帮助自动化项目版本发布,它依赖于POM中的SCM信息。release:prepare拿来打算版本发布,具体的工作包括检测是否有未递交代码、检查是否有SNAPSHOT依赖、升级项目的SNAPSHOT版本至RELEASE版本、为项目打标签等等。release:perform则 是签出标签中的RELEASE源码,构建并发布。版本发布是十分繁杂的工作,它涉及了各类检测,而且因为该工作仅仅是时常须要,因此自动操作很容易遗漏一 些细节,maven-release-plugin使该工作显得十分快速简便,不易出错。maven-release-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传入属性的值,以实现更为灵活的建立。

  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参数实现的。

  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

  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

  在进行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

  很多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库房搜索引擎如也能帮助你快速找到自己感兴趣的Maven插件。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线