常用maven插件介紹

我們都知道Maven本質(zhì)上是一個(gè)插件框架,它的核心并不執(zhí)行任何具體的構(gòu)建任務(wù)典阵,所有這些任務(wù)都交給插件來完成奠滑,例如編譯源代碼是由maven- compiler-plugin完成的。進(jìn)一步說酝静,每個(gè)任務(wù)對(duì)應(yīng)了一個(gè)插件目標(biāo)(goal)辩棒,每個(gè)插件會(huì)有一個(gè)或者多個(gè)目標(biāo)狼忱,例如maven- compiler-plugincompile目標(biāo)用來編譯位于src/main/java/
目錄下的主源碼,testCompile
目標(biāo)用來編譯位于**src/test/java/
**目錄下的測(cè)試源碼一睁。


用戶可以通過兩種方式調(diào)用Maven插件目標(biāo)钻弄。第一種方式是將插件目標(biāo)與生命周期階段(lifecycle phase)綁定,這樣用戶在命令行只是輸入生命周期階段而已者吁,例如Maven默認(rèn)將maven-compiler-plugincompile目標(biāo)與 compile生命周期階段綁定窘俺,因此命令mvn compile實(shí)際上是先定位到compile這一生命周期階段,然后再根據(jù)綁定關(guān)系調(diào)用maven-compiler-plugincompile目標(biāo)复凳。第二種方式是直接在命令行指定要執(zhí)行的插件目標(biāo)瘤泪,例如mvn archetype:generate 就表示調(diào)用maven-archetype-plugingenerate目標(biāo)灶泵,這種帶冒號(hào)的調(diào)用方式與生命周期無關(guān)。


認(rèn)識(shí)上述Maven插件的基本概念能幫助你理解Maven的工作機(jī)制对途,不過要想更高效率地使用Maven丘逸,了解一些常用的插件還是很有必要的,這可 以幫助你避免一不小心重新發(fā)明輪子掀宋。多年來Maven社區(qū)積累了大量的經(jīng)驗(yàn),并隨之形成了一個(gè)成熟的插件生態(tài)圈仲锄。Maven官方有兩個(gè)插件列表劲妙,第一個(gè)列 表的GroupIdorg.apache.maven.plugins,這里的插件最為成熟儒喊,具體地址為:http://maven.apache.org/plugins/index.html镣奋。第二個(gè)列表的GroupIdorg.codehaus.mojo,這里的插件沒有那么核心怀愧,但也有不少十分有用侨颈,其地址為:http://mojo.codehaus.org/plugins.html

1.maven-antrun-plugin

maven-antrun-plugin 能讓用戶在 Maven 項(xiàng)目中運(yùn)行 Ant 任務(wù)芯义。用戶可以直接在該插件的配置以 Ant 的方式編寫 Target哈垢, 然后交給該插件的run目標(biāo)去執(zhí)行。在一些由 Ant 往 Maven 遷移的項(xiàng)目中扛拨,該插件尤其有用耘分。此外當(dāng)你發(fā)現(xiàn)需要編寫一些自定義程度很高的任務(wù),同時(shí)又覺得 Maven 不夠靈活時(shí)绑警,也可以以 Ant 的方式實(shí)現(xiàn)之求泰。maven-antrun-plugin 的 run 目標(biāo)通常與生命周期綁定運(yùn)行。

2.maven-archetype-plugin

Archtype指項(xiàng)目的骨架计盒,Maven初學(xué)者最開始執(zhí)行的Maven命令可能就是mvn archetype:generate渴频,這實(shí)際上就是讓maven-archetype-plugin生成一個(gè)很簡(jiǎn)單的項(xiàng)目骨架,幫助開發(fā)者快速上手北启〔防剩可能也有人看到一些文檔寫了mvn archetype:create, 但實(shí)際上create目標(biāo)已經(jīng)被棄用了暖庄,取而代之的是generate目標(biāo)聊替,該目標(biāo)使用交互式的方式提示用戶輸入必要的信息以創(chuàng)建項(xiàng)目,體驗(yàn)更好培廓。 maven-archetype-plugin還有一些其他目標(biāo)幫助用戶自己定義項(xiàng)目原型惹悄,例如你由一個(gè)產(chǎn)品需要交付給很多客戶進(jìn)行二次開發(fā),你就可以為 他們提供一個(gè)Archtype肩钠,幫助他們快速上手泣港。

3.maven-assembly-plugin

maven-assembly-plugin的用途是制作項(xiàng)目分發(fā)包暂殖,該分發(fā)包可能包含了項(xiàng)目的可執(zhí)行文件、源代碼当纱、readme呛每、平臺(tái)腳本等等。 maven-assembly-plugin支持各種主流的格式如zip坡氯、tar.gz晨横、jar和war等,具體打包哪些文件是高度可控的箫柳,例如用戶可以 按文件級(jí)別的粒度手形、文件集級(jí)別的粒度、模塊級(jí)別的粒度悯恍、以及依賴級(jí)別的粒度控制打包库糠,此外,包含和排除配置也是支持的涮毫。maven-assembly- plugin要求用戶使用一個(gè)名為assembly.xml的元數(shù)據(jù)文件來表述打包瞬欧,它的single目標(biāo)可以直接在命令行調(diào)用,也可以被綁定至生命周期罢防。

4.maven-dependency-plugin

maven-dependency-plugin最大的用途是幫助分析項(xiàng)目依賴艘虎,dependency:list能夠列出項(xiàng)目最終解析到的依賴列表,dependency:tree能進(jìn)一步的描繪項(xiàng)目依賴樹篙梢,dependency:analyze可以告訴你項(xiàng)目依賴潛在的問題顷帖,如果你有直接使用到的卻未聲明的依賴,該目標(biāo)就會(huì)發(fā)出警告渤滞。maven-dependency-plugin還有很多目標(biāo)幫助你操作依賴文件贬墩,例如dependency:copy-dependencies能將項(xiàng)目依賴從本地Maven倉(cāng)庫復(fù)制到某個(gè)特定的文件夾下面。

5.maven-enforcer-plugin

在一個(gè)稍大一點(diǎn)的組織或團(tuán)隊(duì)中妄呕,你無法保證所有成員都熟悉Maven陶舞,那他們做一些比較愚蠢的事情就會(huì)變得很正常,例如給項(xiàng)目引入了外部的 SNAPSHOT依賴而導(dǎo)致構(gòu)建不穩(wěn)定绪励,使用了一個(gè)與大家不一致的Maven版本而經(jīng)常抱怨構(gòu)建出現(xiàn)詭異問題肿孵。maven-enforcer- plugin能夠幫助你避免之類問題,它允許你創(chuàng)建一系列規(guī)則強(qiáng)制大家遵守疏魏,包括設(shè)定Java版本停做、設(shè)定Maven版本、禁止某些依賴大莫、禁止 SNAPSHOT依賴蛉腌。只要在一個(gè)父POM配置規(guī)則,然后讓大家繼承,當(dāng)規(guī)則遭到破壞的時(shí)候烙丛,Maven就會(huì)報(bào)錯(cuò)舅巷。除了標(biāo)準(zhǔn)的規(guī)則之外,你還可以擴(kuò)展該插 件河咽,編寫自己的規(guī)則钠右。maven-enforcer-plugin的enforce目標(biāo)負(fù)責(zé)檢查規(guī)則,它默認(rèn)綁定到生命周期的validate階段忘蟹。

6.maven-help-plugin

maven-help-plugin是一個(gè)小巧的輔助工具飒房,最簡(jiǎn)單的help:system可以打印所有可用的環(huán)境變量和Java系統(tǒng)屬性。help:effective-pomhelp:effective-settings最 為有用媚值,它們分別打印項(xiàng)目的有效POM和有效settings情屹,有效POM是指合并了所有父POM(包括Super POM)后的XML,當(dāng)你不確定POM的某些信息從何而來時(shí)杂腰,就可以查看有效POM。有效settings同理椅文,特別是當(dāng)你發(fā)現(xiàn)自己配置的 settings.xml沒有生效時(shí)喂很,就可以用help:effective-settings來驗(yàn)證。此外皆刺,maven-help-plugin的describe目標(biāo)可以幫助你描述任何一個(gè)Maven插件的信息少辣,還有all-profiles目標(biāo)和active-profiles目標(biāo)幫助查看項(xiàng)目的Profile。

7.maven-release-plugin

maven-release-plugin的用途是幫助自動(dòng)化項(xiàng)目版本發(fā)布羡蛾,它依賴于POM中的SCM信息漓帅。release:prepare用來準(zhǔn)備版本發(fā)布,具體的工作包括檢查是否有未提交代碼痴怨、檢查是否有SNAPSHOT依賴忙干、升級(jí)項(xiàng)目的SNAPSHOT版本至RELEASE版本、為項(xiàng)目打標(biāo)簽等等浪藻。release:perform則 是簽出標(biāo)簽中的RELEASE源碼捐迫,構(gòu)建并發(fā)布。版本發(fā)布是非嘲瑣碎的工作施戴,它涉及了各種檢查,而且由于該工作僅僅是偶爾需要萌丈,因此手動(dòng)操作很容易遺漏一 些細(xì)節(jié)赞哗,maven-release-plugin讓該工作變得非常快速簡(jiǎn)便辆雾,不易出錯(cuò)肪笋。maven-release-plugin的各種目標(biāo)通常直接在 命令行調(diào)用,因?yàn)榘姹景l(fā)布顯然不是日常構(gòu)建生命周期的一部分。

8.maven-resources-plugin

為了使項(xiàng)目結(jié)構(gòu)更為清晰涂乌,Maven區(qū)別對(duì)待Java代碼文件和資源文件艺栈,maven-compiler-plugin用來編譯Java代碼,maven-resources-plugin則用來處理資源文件湾盒。默認(rèn)的主資源文件目錄是src/main/resources
湿右,很多用戶會(huì)需要添加額外的資源文件目錄,這個(gè)時(shí)候就可以通過配置maven-resources-plugin來實(shí)現(xiàn)罚勾。此外毅人,資源文件過濾也是Maven的一大特性,你可以在資源文件中使用${propertyName}形式的Maven屬性尖殃,然后配置maven-resources-plugin開啟對(duì)資源文件的過濾丈莺,之后就可以針對(duì)不同環(huán)境通過命令行或者Profile傳入屬性的值,以實(shí)現(xiàn)更為靈活的構(gòu)建送丰。

9.maven-surefire-plugin

可能是由于歷史的原因缔俄,Maven 2/3中用于執(zhí)行測(cè)試的插件不是maven-test-plugin,而是maven-surefire-plugin器躏。其實(shí)大部分時(shí)間內(nèi)俐载,只要你的測(cè)試 類遵循通用的命令約定(以Test結(jié)尾、以TestCase結(jié)尾登失、或者以Test開頭)遏佣,就幾乎不用知曉該插件的存在。然而在當(dāng)你想要跳過測(cè)試揽浙、排除某些 測(cè)試類状婶、或者使用一些TestNG特性的時(shí)候,了解maven-surefire-plugin的一些配置選項(xiàng)就很有用了馅巷。例如 mvn test -Dtest=FooTest 這樣一條命令的效果是僅運(yùn)行FooTest測(cè)試類膛虫,這是通過控制maven-surefire-plugin的test參數(shù)實(shí)現(xiàn)的。

10.build-helper-maven-plugin

Maven默認(rèn)只允許指定一個(gè)主Java代碼目錄和一個(gè)測(cè)試Java代碼目錄钓猬,雖然這其實(shí)是個(gè)應(yīng)當(dāng)盡量遵守的約定走敌,但偶爾你還是會(huì)希望能夠指定多個(gè) 源碼目錄(例如為了應(yīng)對(duì)遺留項(xiàng)目),build-helper-maven-plugin的add-source目標(biāo)就是服務(wù)于這個(gè)目的逗噩,通常它被綁定到 默認(rèn)生命周期的generate-sources階段以添加額外的源碼目錄掉丽。需要強(qiáng)調(diào)的是,這種做法還是不推薦的异雁,因?yàn)樗茐牧?Maven的約定捶障,而且可能會(huì)遇到其他嚴(yán)格遵守約定的插件工具無法正確識(shí)別額外的源碼目錄。
build-helper-maven-plugin的另一個(gè)非常有用的目標(biāo)是attach-artifact纲刀,使用該目標(biāo)你可以以classifier的形式選取部分項(xiàng)目文件生成附屬構(gòu)件项炼,并同時(shí)install到本地倉(cāng)庫,也可以deploy到遠(yuǎn)程倉(cāng)庫。

11.exec-maven-plugin

exec-maven-plugin很好理解锭部,顧名思義暂论,它能讓你運(yùn)行任何本地的系統(tǒng)程序,在某些特定情況下拌禾,運(yùn)行一個(gè)Maven外部的程序可能就是最簡(jiǎn)單的問題解決方案取胎,這就是exec:exec的 用途,當(dāng)然湃窍,該插件還允許你配置相關(guān)的程序運(yùn)行參數(shù)闻蛀。除了exec目標(biāo)之外,exec-maven-plugin還提供了一個(gè)java目標(biāo)您市,該目標(biāo)要求你 提供一個(gè)mainClass參數(shù)觉痛,然后它能夠利用當(dāng)前項(xiàng)目的依賴作為classpath,在同一個(gè)JVM中運(yùn)行該mainClass茵休。有時(shí)候薪棒,為了簡(jiǎn)單的 演示一個(gè)命令行Java程序,你可以在POM中配置好exec-maven-plugin的相關(guān)運(yùn)行參數(shù)榕莺,然后直接在命令運(yùn)行 mvn exec:java 以查看運(yùn)行效果盗尸。

12.jetty-maven-plugin

在進(jìn)行Web開發(fā)的時(shí)候,打開瀏覽器對(duì)應(yīng)用進(jìn)行手動(dòng)的測(cè)試幾乎是無法避免的帽撑,這種測(cè)試方法通常就是將項(xiàng)目打包成war文件,然后部署到Web容器 中鞍时,再啟動(dòng)容器進(jìn)行驗(yàn)證亏拉,這顯然十分耗時(shí)。為了幫助開發(fā)者節(jié)省時(shí)間逆巍,jetty-maven-plugin應(yīng)運(yùn)而生及塘,它完全兼容 Maven項(xiàng)目的目錄結(jié)構(gòu),能夠周期性地檢查源文件锐极,一旦發(fā)現(xiàn)變更后自動(dòng)更新到內(nèi)置的Jetty Web容器中笙僚。做一些基本配置后(例如Web應(yīng)用的contextPath和自動(dòng)掃描變更的時(shí)間間隔),你只要執(zhí)行 mvn jetty:run 灵再,然后在IDE中修改代碼肋层,代碼經(jīng)IDE自動(dòng)編譯后產(chǎn)生變更,再由jetty-maven-plugin偵測(cè)到后更新至Jetty容器翎迁,這時(shí)你就可以直接 測(cè)試Web頁面了栋猖。需要注意的是,jetty-maven-plugin并不是宿主于Apache或Codehaus的官方插件汪榔,因此使用的時(shí)候需要額外 的配置settings.xml的pluginGroups元素蒲拉,將org.mortbay.jetty這個(gè)pluginGroup加入。

13.versions-maven-plugin

很多Maven用戶遇到過這樣一個(gè)問題,當(dāng)項(xiàng)目包含大量模塊的時(shí)候雌团,為他們集體更新版本就變成一件煩人的事情燃领,到底有沒有自動(dòng)化工具能幫助完成這件 事情呢?(當(dāng)然你可以使用sed之類的文本操作工具锦援,不過不在本文討論范圍)答案是肯定的猛蔽,versions-maven- plugin提供了很多目標(biāo)幫助你管理Maven項(xiàng)目的各種版本信息。例如最常用的雨涛,命令 mvn versions:set -DnewVersion=1.1-SNAPSHOT 就能幫助你把所有模塊的版本更新到1.1-SNAPSHOT枢舶。該插件還提供了其他一些很有用的目標(biāo),display-dependency- updates能告訴你項(xiàng)目依賴有哪些可用的更新替久;類似的display-plugin-updates能告訴你可用的插件更新凉泄;然后use- latest-versions能自動(dòng)幫你將所有依賴升級(jí)到最新版本。最后蚯根,如果你對(duì)所做的更改滿意后众,則可以使用 mvn versions:commit 提交,不滿意的話也可以使用 mvn versions:revert 進(jìn)行撤銷颅拦。

小結(jié)
本文介紹了一些最常用的Maven插件蒂誉,這里指的“常用”是指經(jīng)常需要進(jìn)行配置的插件,事實(shí)上我們用Maven的時(shí)候很多其它插件也是必須的距帅,例如 默認(rèn)的編譯插件maven-compiler-plugin和默認(rèn)的打包插件maven-jar-plugin右锨,但因?yàn)楹苌傩枰獙?duì)它們進(jìn)行配置,因此不在 本文討論范圍碌秸。了解常用的Maven插件能幫助你事倍功半地完成項(xiàng)目構(gòu)建任務(wù)绍移,反之你就可能會(huì)因?yàn)榻?jīng)常遇到一些難以解決的問題而感到沮喪。本文介紹的插件 基本能覆蓋大部分Maven用戶的日常使用需要讥电,如果你真有非常特殊的需求蹂窖,自行編寫一個(gè)Maven插件也不是難事,更何況還有這么多開放源代碼的插件供 你參考恩敌。
本文的這個(gè)插件列表并不是一個(gè)完整列表瞬测,讀者有興趣的話也可以去仔細(xì)瀏覽一下Apache和Codehaus Mojo的Maven插件列表,以的到一個(gè)更為全面的認(rèn)識(shí)纠炮。最后月趟,在線的Maven倉(cāng)庫搜索引擎如http://search.maven.org/也能幫助你快速找到自己感興趣的Maven插件。

參考文章:種菜得瓜

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恢口,一起剝皮案震驚了整個(gè)濱河市狮斗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌弧蝇,老刑警劉巖碳褒,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件折砸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡沙峻,警方通過查閱死者的電腦和手機(jī)睦授,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摔寨,“玉大人去枷,你說我怎么就攤上這事∈歉矗” “怎么了删顶?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)淑廊。 經(jīng)常有香客問我逗余,道長(zhǎng),這世上最難降的妖魔是什么季惩? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任录粱,我火速辦了婚禮,結(jié)果婚禮上画拾,老公的妹妹穿的比我還像新娘啥繁。我一直安慰自己,他們只是感情好青抛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布旗闽。 她就那樣靜靜地躺著,像睡著了一般蜜另。 火紅的嫁衣襯著肌膚如雪适室。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天蚕钦,我揣著相機(jī)與錄音,去河邊找鬼鹅很。 笑死嘶居,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的促煮。 我是一名探鬼主播邮屁,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼菠齿!你這毒婦竟也來了佑吝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤绳匀,失蹤者是張志新(化名)和其女友劉穎芋忿,沒想到半個(gè)月后炸客,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戈钢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年痹仙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殉了。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡开仰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薪铜,到底是詐尸還是另有隱情众弓,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布隔箍,位于F島的核電站谓娃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鞍恢。R本人自食惡果不足惜傻粘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帮掉。 院中可真熱鬧弦悉,春花似錦、人聲如沸蟆炊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涩搓。三九已至污秆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昧甘,已是汗流浹背良拼。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留充边,地道東北人庸推。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像浇冰,于是被迫代替她去往敵國(guó)和親贬媒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容