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-antrun-plugin

http://maven.apache.org/plugins/maven-antrun-plugin/框架

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

maven-archetype-plugin

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,幫助他們快速上手。測試

maven-assembly-plugin

http://maven.apache.org/plugins/maven-assembly-plugin/網站

maven-assembly-plugin的用途是製做項目分發包,該分發包可能包含了項目的可執行文件、源代碼、readme、平臺腳本等等。 maven-assembly-plugin支持各類主流的格式如zip、tar.gz、jar和war等,具體打包哪些文件是高度可控的,例如用戶能夠 按文件級別的粒度、文件集級別的粒度、模塊級別的粒度、以及依賴級別的粒度控制打包,此外,包含和排除配置也是支持的。maven-assembly- plugin要求用戶使用一個名爲assembly.xml的元數據文件來表述打包,它的single目標能夠直接在命令行調用,也能夠被綁定至生命週期。spa

maven-dependency-plugin

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

maven-dependency-plugin最大的用途是幫助分析項目依賴,dependency:list可以列出項目最終解析到的依賴列表,dependency:tree能進一步的描繪項目依賴樹,dependency:analyze能夠告訴你項目依賴潛在的問題,若是你有直接使用到的卻未聲明的依賴,該目標就會發出警告。maven-dependency-plugin還有不少目標幫助你操做依賴文件,例如dependency:copy-dependencies能將項目依賴從本地Maven倉庫複製到某個特定的文件夾下面。

maven-enforcer-plugin

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

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

maven-help-plugin

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

maven-help-plugin是一個小巧的輔助工具,最簡單的help:system能夠打印全部可用的環境變量和Java系統屬性。help:effective-pomhelp: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

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的各類目標一般直接在 命令行調用,由於版本發佈顯然不是平常構建生命週期的一部分。

關於做者

許曉斌(Juven Xu),國內社區公認的Maven技術專家、Maven中文用戶組創始人、Maven技術的先驅和積極推進者,著有《Maven實戰》一 書。對Maven有深入的認識,實戰經驗豐富,不只撰寫了大量關於Maven的技術文章,並且還翻譯了開源書籍《Maven權威指南》,對Maven技術 在國內的普及和發展作出了很大的貢獻。就任於Maven之父的公司,負責維護Maven中央倉庫,是Maven倉庫管理器Nexus(著名開源軟件)的核 心開發者之一,曾屢次受邀到淘寶等大型企業開展Maven方面的培訓。此外,他仍是開源技術的積極倡導者和推進者,擅長Java開發和敏捷開發實踐。他的 我的網站是:http://www.juvenxu.com

相關文章
相關標籤/搜索