天天看點

常用Maven插件介紹

我們都知道Maven本質上是一個插件架構,它的核心并不執行任何具體的建構任務,所有 這些任務都交給插件來完成,例如編譯源代碼是由maven- compiler-plugin完成的。進一步說,每個任務對應了一個插件目标(goal),每個插件會有一個或者多個目标,例如maven- compiler-plugin的compile目标用來編譯位于<code>src/main/java/</code>目錄下的主源碼,testCompile目标用來編譯位于<code>src/test/java/</code>目錄下的測試源碼。

使用者可以通過兩種方式調用Maven插件目标。第一種方式是将插件目标與生命周期階段(lifecycle phase)綁定,這樣使用者在指令行隻是輸入生命周期階段而已,例如Maven預設将maven-compiler-plugin的compile目标與 compile生命周期階段綁定,是以指令mvn compile實際上是先定位到compile這一生命周期階段,然後再根據綁定關系調用maven-compiler-plugin的compile目标。第二種方式是直接在指令行指定要執行的插件目标,例如mvn archetype:generate 就表示調用maven-archetype-plugin的generate目标,這種帶冒号的調用方式與生命周期無關。

接下來筆者根據自己的經驗介紹一些最常用的Maven插件,在不同的環境下它們各自都有其出色的表現,熟練地使用它們能讓你的日常建構工作事半功倍。

<a href="http://maven.apache.org/plugins/maven-antrun-plugin/">http://maven.apache.org/plugins/maven-antrun-plugin/</a>

maven-antrun-plugin能讓使用者在Maven項目中運作Ant任務。使用者可以直接在該插件的配置以Ant的方式編寫Target, 然後交給該插件的run目标去執行。在一些由Ant往Maven遷移的項目中,該插件尤其有用。此外當你發現需要編寫一些自定義程度很高的任務,同時又覺 得Maven不夠靈活時,也可以以Ant的方式實作之。maven-antrun-plugin的run目标通常與生命周期綁定運作。

<a href="http://maven.apache.org/archetype/maven-archetype-plugin/">http://maven.apache.org/archetype/maven-archetype-plugin/</a>

Archtype指項目的骨架,Maven初學者最開始執行的Maven指令可能就是mvn archetype:generate,這實際上就是讓maven-archetype-plugin生成一個很簡單的項目骨架,幫助開發者快速上手。可能也有人看到一些文檔寫了mvn archetype:create, 但實際上create目标已經被棄用了,取而代之的是generate目标,該目标使用互動式的方式提示使用者輸入必要的資訊以建立項目,體驗更好。 maven-archetype-plugin還有一些其他目标幫助使用者自己定義項目原型,例如你由一個産品需要傳遞給很多客戶進行二次開發,你就可以為 他們提供一個Archtype,幫助他們快速上手。

<a href="http://maven.apache.org/plugins/maven-assembly-plugin/">http://maven.apache.org/plugins/maven-assembly-plugin/</a>

maven-assembly-plugin的用途是制作項目分發包,該分發包可能包含了項目的可執行檔案、源代碼、readme、平台腳本等等。 maven-assembly-plugin支援各種主流的格式如zip、tar.gz、jar和war等,具體打包哪些檔案是高度可控的,例如使用者可以 按檔案級别的粒度、檔案集級别的粒度、子產品級别的粒度、以及依賴級别的粒度控制打包,此外,包含和排除配置也是支援的。maven-assembly- plugin要求使用者使用一個名為<code>assembly.xml</code>的中繼資料檔案來表述打包,它的single目标可以直接在指令行調用,也可以被綁定至生命周期。

<a href="http://maven.apache.org/plugins/maven-dependency-plugin/">http://maven.apache.org/plugins/maven-dependency-plugin/</a>

maven-dependency-plugin最大的用途是幫助分析項目依賴,dependency:list能夠列出項目最終解析到的依賴清單,dependency:tree能進一步的描繪項目依賴樹,dependency:analyze可以告訴你項目依賴潛在的問題,如果你有直接使用到的卻未聲明的依賴,該目标就會發出警告。maven-dependency-plugin還有很多目标幫助你操作依賴檔案,例如dependency:copy-dependencies能将項目依賴從本地Maven倉庫複制到某個特定的檔案夾下面。

<a href="http://maven.apache.org/plugins/maven-enforcer-plugin/">http://maven.apache.org/plugins/maven-enforcer-plugin/</a>

在一個稍大一點的組織或團隊中,你無法保證所有成員都熟悉Maven,那他們做一些比較愚蠢的事情就會變得很正常,例如給項目引入了外部的 SNAPSHOT依賴而導緻建構不穩定,使用了一個與大家不一緻的Maven版本而經常抱怨建構出現詭異問題。maven-enforcer- plugin能夠幫助你避免之類問題,它允許你建立一系列規則強制大家遵守,包括設定Java版本、設定Maven版本、禁止某些依賴、禁止 SNAPSHOT依賴。隻要在一個父POM配置規則,然後讓大家繼承,當規則遭到破壞的時候,Maven就會報錯。除了标準的規則之外,你還可以擴充該插 件,編寫自己的規則。maven-enforcer-plugin的enforce目标負責檢查規則,它預設綁定到生命周期的validate階段。

<a href="http://maven.apache.org/plugins/maven-help-plugin/">http://maven.apache.org/plugins/maven-help-plugin/</a>

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。

<a href="http://maven.apache.org/plugins/maven-release-plugin/">http://maven.apache.org/plugins/maven-release-plugin/</a>

maven-release-plugin的用途是幫助自動化項目版本釋出,它依賴于POM中的SCM資訊。release:prepare用來準備版本釋出,具體的工作包括檢查是否有未送出代碼、檢查是否有SNAPSHOT依賴、更新項目的SNAPSHOT版本至RELEASE版本、為項目打标簽等等。release:perform則 是簽出标簽中的RELEASE源碼,建構并釋出。版本釋出是非常瑣碎的工作,它涉及了各種檢查,而且由于該工作僅僅是偶爾需要,是以手動操作很容易遺漏一 些細節,maven-release-plugin讓該工作變得非常快速簡便,不易出錯。maven-release-plugin的各種目标通常直接在 指令行調用,因為版本釋出顯然不是日常建構生命周期的一部分。

<a href="http://maven.apache.org/plugins/maven-resources-plugin/">http://maven.apache.org/plugins/maven-resources-plugin/</a>

為了使項目結構更為清晰,Maven差別對待Java代碼檔案和資源檔案,maven-compiler-plugin用來編譯Java代碼,maven-resources-plugin則用來處理資源檔案。預設的主資源檔案目錄是<code>src/main/resources</code>,很多使用者會需要添加額外的資源檔案目錄,這個時候就可以通過配置maven-resources-plugin來實作。此外,資源檔案過濾也是Maven的一大特性,你可以在資源檔案中使用${propertyName}形式的Maven屬性,然後配置maven-resources-plugin開啟對資源檔案的過濾,之後就可以針對不同環境通過指令行或者Profile傳入屬性的值,以實作更為靈活的建構。

<a href="http://maven.apache.org/plugins/maven-surefire-plugin/">http://maven.apache.org/plugins/maven-surefire-plugin/</a>

可能是由于曆史的原因,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參數實作的。

<a href="http://mojo.codehaus.org/build-helper-maven-plugin/">http://mojo.codehaus.org/build-helper-maven-plugin/</a>

Maven預設隻允許指定一個主Java代碼目錄和一個測試Java代碼目錄,雖然這其實是個應當盡量遵守的約定,但偶爾你還是會希望能夠指定多個 源碼目錄(例如為了應對遺留項目),build-helper-maven-plugin的add-source目标就是服務于這個目的,通常它被綁定到 預設生命周期的generate-sources階段以添加額外的源碼目錄。需要強調的是,這種做法還是不推薦的,因為它破壞了 Maven的約定,而且可能會遇到其他嚴格遵守約定的插件工具無法正确識别額外的源碼目錄。

build-helper-maven-plugin的另一個非常有用的目标是attach-artifact,使用該目标你可以以classifier的形式選取部分項目檔案生成附屬構件,并同時install到本地倉庫,也可以deploy到遠端倉庫。

<a href="http://mojo.codehaus.org/exec-maven-plugin/">http://mojo.codehaus.org/exec-maven-plugin/</a>

exec-maven-plugin很好了解,顧名思義,它能讓你運作任何本地的系統程式,在某些特定情況下,運作一個Maven外部的程式可能就是最簡單的問題解決方案,這就是exec:exec的 用途,當然,該插件還允許你配置相關的程式運作參數。除了exec目标之外,exec-maven-plugin還提供了一個java目标,該目标要求你 提供一個mainClass參數,然後它能夠利用目前項目的依賴作為classpath,在同一個JVM中運作該mainClass。有時候,為了簡單的 示範一個指令行Java程式,你可以在POM中配置好exec-maven-plugin的相關運作參數,然後直接在指令運作 mvn exec:java 以檢視運作效果。

<a href="http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin">http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin</a>

在進行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的官方插件,是以使用的時候需要額外 的配置<code>settings.xml</code>的pluginGroups元素,将org.mortbay.jetty這個pluginGroup加入。

<a href="http://mojo.codehaus.org/versions-maven-plugin/">http://mojo.codehaus.org/versions-maven-plugin/</a>

很多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插件也不是難事,更何況還有這麼多開放源代碼的插件供 你參考。

本文轉自快樂就好部落格園部落格,原文連結:http://www.cnblogs.com/happyday56/p/4648218.html,如需轉載請自行聯系原作者