轉自 : http://www.infoq.com/cn/news/2011/04/xxb-maven-7-pluginhtml
咱們都知道Maven本質上是一個插件框架,它的核心並不執行任何具體的構建任務,全部這些任務都交給插件來完成,例如編譯源代碼是由maven-compiler-plugin完成的。進一步說,每一個任務對應了一個插件目標(goal),每一個插件會有一個或者多個目標,例如maven-compiler-plugin的compile目標用來編譯位於src/main/java/
目錄下的主源碼,testCompile目標用來編譯位於src/test/java/
目錄下的測試源碼。java
用戶能夠經過兩種方式調用Maven插件目標。第一種方式是將插件目標與生命週期階段(lifecycle phase)綁定,這樣用戶在命令行只是輸入生命週期階段而已,例如Maven默認將maven-compiler-plugin的compile目標與compile生命週期階段綁定,所以命令mvn compile其實是先定位到compile這一輩子命週期階段,而後再根據綁定關係調用maven-compiler-plugin的compile目標。第二種方式是直接在命令行指定要執行的插件目標,例如mvn archetype:generate 就表示調用maven-archetype-plugin的generate目標,這種帶冒號的調用方式與生命週期無關。apache
認識上述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.html。併發
接下來筆者根據本身的經驗介紹一些最經常使用的Maven插件,在不一樣的環境下它們各自都有其出色的表現,熟練地使用它們能讓你的平常構建工做事半功倍。框架
http://maven.apache.org/plugins/maven-antrun-plugin/maven
maven-antrun-plugin能讓用戶在Maven項目中運行Ant任務。用戶能夠直接在該插件的配置以Ant的方式編寫Target,而後交給該插件的run目標去執行。在一些由Ant往Maven遷移的項目中,該插件尤爲有用。此外當你發現須要編寫一些自定義程度很高的任務,同時又以爲Maven不夠靈活時,也能夠以Ant的方式實現之。maven-antrun-plugin的run目標一般與生命週期綁定運行。ide
http://maven.apache.org/archetype/maven-archetype-plugin/工具
Archtype指項目的骨架,Maven初學者最開始執行的Maven命令可能就是mvn archetype:generate,這實際上就是讓maven-archetype-plugin生成一個很簡單的項目骨架,幫助開發者快速上手。可能也有人看到一些文檔寫了mvn archetype:create,但實際上create目標已經被棄用了,取而代之的是generate目標,該目標使用交互式的方式提示用戶輸入必要的信息以建立項目,體驗更好。maven-archetype-plugin還有一些其餘目標幫助用戶本身定義項目原型,例如你由一個產品須要交付給不少客戶進行二次開發,你就能夠爲他們提供一個Archtype,幫助他們快速上手。測試
http://maven.apache.org/plugins/maven-assembly-plugin/spa
maven-assembly-plugin的用途是製做項目分發包,該分發包可能包含了項目的可執行文件、源代碼、readme、平臺腳本等等。maven-assembly-plugin支持各類主流的格式如zip、tar.gz、jar和war等,具體打包哪些文件是高度可控的,例如用戶能夠按文件級別的粒度、文件集級別的粒度、模塊級別的粒度、以及依賴級別的粒度控制打包,此外,包含和排除配置也是支持的。maven-assembly-plugin要求用戶使用一個名爲assembly.xml
的元數據文件來表述打包,它的single目標能夠直接在命令行調用,也能夠被綁定至生命週期。
http://maven.apache.org/plugins/maven-dependency-plugin/
maven-dependency-plugin最大的用途是幫助分析項目依賴,dependency:list可以列出項目最終解析到的依賴列表,dependency:tree能進一步的描繪項目依賴樹,dependency:analyze能夠告訴你項目依賴潛在的問題,若是你有直接使用到的卻未聲明的依賴,該目標就會發出警告。maven-dependency-plugin還有不少目標幫助你操做依賴文件,例如dependency:copy-dependencies能將項目依賴從本地Maven倉庫複製到某個特定的文件夾下面。
http://maven.apache.org/plugins/maven-enforcer-plugin/
在一個稍大一點的組織或團隊中,你沒法保證全部成員都熟悉Maven,那他們作一些比較愚蠢的事情就會變得很正常,例如給項目引入了外部的SNAPSHOT依賴而致使構建不穩定,使用了一個與你們不一致的Maven版本而常常抱怨構建出現詭異問題。maven-enforcer-plugin可以幫助你避免之類問題,它容許你建立一系列規則強制你們遵照,包括設定Java版本、設定Maven版本、禁止某些依賴、禁止SNAPSHOT依賴。只要在一個父POM配置規則,而後讓你們繼承,當規則遭到破壞的時候,Maven就會報錯。除了標準的規則以外,你還能夠擴展該插件,編寫本身的規則。maven-enforcer-plugin的enforce目標負責檢查規則,它默認綁定到生命週期的validate階段。
http://maven.apache.org/plugins/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。
http://maven.apache.org/plugins/maven-release-plugin/
maven-release-plugin的用途是幫助自動化項目版本發佈,它依賴於POM中的SCM信息。release:prepare用來準備版本發佈,具體的工做包括檢查是否有未提交代碼、檢查是否有SNAPSHOT依賴、升級項目的SNAPSHOT版本至RELEASE版本、爲項目打標籤等等。release:perform則是簽出標籤中的RELEASE源碼,構建併發布。版本發佈是很是瑣碎的工做,它涉及了各類檢查,並且因爲該工做僅僅是偶爾須要,所以手動操做很容易遺漏一些細節,maven-release-plugin讓該工做變得很是快速簡便,不易出錯。maven-release-plugin的各類目標一般直接在命令行調用,由於版本發佈顯然不是平常構建生命週期的一部分。