常用Maven插件介紹(上)
轉自https://www.infoq.com/cn/news/2011/04/xxb-maven-7-plugin
我們都知道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,這裏的插件最為成熟,具體地址為:https://maven.apache.org/plugins/index.html。第二個列表的GroupId為org.codehaus.mojo,這裏的插件沒有那麼核心,但也有不少十分有用,其地址為:https://mojo.codehaus.org/plugins.html。
接下來筆者根據自己的經驗介紹一些最常用的Maven插件,在不同的環境下它們各自都有其出色的表現,熟練地使用它們能讓你的日常構建工作事半功倍。
maven-antrun-plugin
https://maven.apache.org/plugins/maven-antrun-plugin/
maven-antrun-plugin能讓用戶在Maven項目中運行Ant任務。用戶可以直接在該插件的配置以Ant的方式編寫Target,然後交給該插件的run目標去執行。在一些由Ant往Maven遷移的項目中,該插件尤其有用。此外當你發現需要編寫一些自定義程度很高的任務,同時又覺得Maven不夠靈活時,也可以以Ant的方式實現之。maven-antrun-plugin的run目標通常與生命周期綁定運行。
maven-archetype-plugin
https://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
https://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目標可以直接在命令行調用,也可以被綁定至生命周期。
maven-dependency-plugin
https://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
https://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
https://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。
maven-release-plugin
https://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的各種目標通常直接在命令行調用,因為版本發布顯然不是日常構建生命周期的一部分。
最後更新:2017-04-04 07:03:41
上一篇:
Mac OS X 內核Rootkit開發指南
下一篇:
STL之七:STL各種容器的使用時機詳解
你的軟件按什麼賣?套數、CPU數、核數還是CPU的計算能力?
項目3:PHP抽獎程序 ,抽獎規則代碼 分時間段
負載均衡(SLB)使用最佳實踐.
Version Control with Git (Udacity)優達學城筆記--L1:What is Version Control
《深入理解Elasticsearch(原書第2版)》一導讀
Linux時間函數之gettimeofday()函數之使用方法
FTP上傳文件示例
11月20日雲棲精選夜讀:圍觀阿裏總部:邊喝茶邊搞技術是一種怎樣的體驗?
雲計算與GigaSpaces
利用objc的runtime來定位次線程中unrecognized selector sent to instance的問題