爲什麼要拋棄maven

項目需要,開始學習maven,今天花了一整天的時間,看完了《Maven實戰》這本書。書是好書,看完之後,對maven整體有了較多的瞭解,也知道了在項目中怎麼去使用,感覺收穫很大。

我感覺maven這一套還是很嚴謹的,雖然繁雜,但是感覺很規範,各種情況它都考慮到了。而且跟Jenkins結合起來,也是很方便的。我想不到還有什麼更好的辦法可以解決它所要解決的問題。

突然想到:爲什麼我以前不喜歡用maven?爲什麼似乎人們也不喜歡maven呢?

我不喜歡是因爲我以前沒有掌握maven,看到那大堆的xml,總有種無法下手的感覺。而且在使用中時老是遇到問題,卻很難在短時間內找到答案。總覺得它太笨重了。

今天看完書也證實了我之前的看法是正常的。maven設計了一套複雜的體系,比如庫的座標、依賴、生命週期、插件等,環環相扣,如果不把這一套東西都搞明白,是沒法下手的。這種情況,跟angularjs很像,都是設計了一套相對封閉但又有特色的體系,雖然內部配合很好,但對於外界就沒那麼友好了。在花時間瞭解、適應、認同它之前,會經常撞牆的。

但爲什麼人們也不喜歡maven呢?應該有很多人對maven很熟悉的,但爲什麼他們還在尋找更好的工具呢?比如buildr,比如gradle?

今天帶着疑問,我搜索了一些文章,大概明白了。

首先要提一下ant,ant與maven是兩個極端。ant很靈活,如同瑞士軍刀,但沒有統一的流程,需要寫很多的代碼,且每個人都有自己的一套。而maven則相反,定義了嚴謹、繁瑣的流程,考慮了很多,但具體到某一個任務的時候,又不夠靈活。要麼你去搜別人寫好的插件,要麼自己寫,不論哪種方式,都會讓人覺得束手束腳,感覺被maven設計出來的鎖鏈綁着。一想到隨便來點什麼都要上插件,讓人壓力巨大。

看到thoughtworks以前有一篇講maven的文章,提到說,對於構建工具,在plugin的層面上抽象,還是不夠靈活。還是需要一種能語言層面上抽象的工具。比如buildr,比如gradle。(原文找不到了,這是我根據搜到的片斷自己理解的)

而gradle正好填上了這兩個極端的中間。它利用groovy提供的dsl,寫起來要比xml舒服很多,而且可以直接如果函數調用般調用ant提供的工具,還可以直接寫groovy(Java)代碼。相比ant/maven,人們反映使用它的感覺要舒服多了。

希望這個項目有機會嘗試一下gradle。


更新:

想不到這篇不太有營養的文章上了“tw好聲音”。正好這幾天在志恆同學的努力下,成功的把項目中的maven換成了gradle,所以趕緊上來補充兩句。

首先關於maven,大家可以看看評論中楊博這篇霸氣的文章:《如果我來設計Maven》,深度有營養。

然後講講項目的情況。

客戶的項目是一個java項目,用maven管理。雖然代碼不多,但是分成了好幾個模塊。在根目錄下放一個總的POM.xml,然後每個子模塊裏一個POM.xml,包含在總POM裏。這幾個月我們一直在它的甚礎上開發,對它進行了多次修補,感覺如下:

  1. 運行慢。運行一次<code>mvn clean test</code>,差不多要五分鐘時間,夠上個廁所泡杯水再聊聊天了。而且每多一個模塊,就會多出一截時間。
  2. 日誌亂。maven的日誌真是超亂,非常難以閱讀。每次出點問題想從日誌裏找線索,都是一場折磨
  3. 文檔難。遇到問題想從maven官網上找點資料,感覺很難。滿屏幕都是文字,爲什麼看不到自己需要的?
  4. 插件煩。P大的一點事也要加插件!比如,我們想建個跟src平級的integationTest目錄,也要下插件!一堆配置!
  5. 心情差。每次編輯POM、看到POM、甚至想到POM,都感覺壓力巨大,直接影響寫代碼心情~

前些天終於要開始開始一個新模塊了,志恆同學實在忍不住,喊出“風險我擔!週末加班我也幹!”的壯語後,花了兩天時間,不僅在新模塊裏配好了gradle,還把之前多個maven模塊也換好了,包括POM裏調用的所有插件。在此向志恆同學致敬:)

現在的gradle腳本看起來舒服多了。代碼簡潔、結構清晰、配置簡單,再配上它的吉祥色綠色,有種春風拂面的感覺:

  1. gradle代碼是由groovy寫成的dsl,寫起來有種json的感覺,簡潔清晰,一句廢話都很難找到。
  2. 文檔很好。由於gradle語法不像XML那樣能提示,所以它的網站文檔很好。清晰、解釋清楚,示例豐富,很有幫助
  3. 插件豐富。gradle內置了對ant任務的支持,表示各種ant任務你都可以直接拿過來用。並且在gradle裏,可以用一種很簡潔的語法去調用它們,像調用函數一般
  4. 功能強大。gradle代碼實際上就是groovy代碼,所以可以方便地嵌入groovy代碼。你既可以在裏面加個println "hello"什麼的幫助調試,又能寫一些較複雜的groovy代碼實現一些複雜的功能。既強大,又靈活。如果需要,不要怕學習另一門語言,因爲比起你“精通maven”所花費的時間精力可要少多了。

由於項目保密的原因,不方便貼出實際代碼,不過在網上應該可以搜到很多maven與gradle代碼的對比例子。我個人感覺因爲有了gradle,groovy終於有了一個殺手級的項目。

等在項目中有更多的gradle使用經驗時,再來更新。

發佈了6 篇原創文章 · 獲贊 8 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章