在Java碼農的世界里,構建工具一直是一個不可或缺的元素。在這個小圈子中影響力最大的角色莫過於Maven了。它使用XML作為配置文件,改進了前輩Ant的復雜的構建配置,提供了一些現成的目標,而不需要我們一個個的將構建任務的每個命令一一列出。另外它提供了一個殺手鐧功能,那就是依賴管理,它通過簡單的配置就可以自動從網絡上下載項目所需的依賴,這革命性的改變了我們開發軟件的方式。可以想象,如果你是一個大型軟件開發項目組的成員,如果使用代碼倉庫管理依賴jar包會令倉庫變得多么龐大!Maven的制品倉庫設計實現了制品與代碼間的解耦,為基於制品的協作提供了可能。
在Java構建領域,我們能夠看到一些新興的工具在涌現。比如基於Groovy的Gradle。Hibernate就將自己的項目從Maven遷移到了Gradle,Google官方Android開發的IDE Android Studio也默認使用了Gradle進行構建。這些事件令Gradle吸引了不少眼球。Gradle真的要替代Maven了么?當然沒有,Maven在如今仍然是Java構建技術的事實標准。Gradle也仍然使用了Maven的制品庫來做依賴管理。但是從Gradle身上,我們確實看到了進步。簡潔的Groovy語法和靈活的配置令我們眼前一亮。
依賴管理
Maven的配置文件是.pom文件。POM是項目對象模型(Project Object Model)的簡稱,它是Maven項目中的文件,使用XML表示。其中包含項目的基本信息,構建過程,環境信息,依賴信息等。在pom.xml中我們需要引入一個依賴時需要將它的groupId, artifactId和version都用標簽引起來。但是在Gradle項目的build.gradle中你會發現,僅僅需要將三者的value用:連起來,並"調用compile函數"就可以啦。
一、構建生命周期管理
除了依賴管理以外,構建工具的另一個主要用途就是構建的生命周期管理。
Maven有三個生命周期,每個生命周期又分為多個階段:
Clean:包含3個階段,與清理上次構建生成的文件相關
Default:Maven的核心生命周期,包含多個階段如預處理、編譯、測試、打包、安裝到本地倉庫、發布到遠程倉庫等。
Site: 包含4個階段,與生成項目報告,站點,發布站點相關。
這些生命周期都是系統自定義好的,如果我們需要修改現有的構建生命周期的話,我們就要編寫一個Maven插件。因為Maven是通過插件發來完成大多數的構建任務。每個插件可以綁定一個生命周期。配置好綁定生命周期后,我們需要定義插件的任務,在Maven中每個任務的goal稱作Mojo,每個Mojo我們都需要實現org.apache.maven.plugin.Mojo接口。也就是我們需要定義一個類來實現這個接口。使用時我們需要引入這個插件,並配置需要執行的goal。
Gradle中有一個基本概念叫Task,我們可以使用Task來完成需求,變得非常簡單。
二、制品發布
在制品發布這個操作上,Maven要扳回一局。Maven原生支持maven jar的格式,發布很簡單;而Gradle雖說既支持Maven又支持Gradle,但是就要我們自己做很多額外的工作。比如Maven要發布制品,只需要配置遠程倉庫的參數,而gradle發布制品,還需要生成pom文件。
最后:Just have a try! Maven和Gradle都是非常優秀的構建工具,增加二者的使用經驗不是一個很虧的事情。