今天infoq上一篇文章,裡面有句話說maven整個一個配置系統的EJB2,說到我心坎裡了。
Maven有maven的好處,但是當你實際用起來maven之後,問題比你想象的要多的多,你很難駕馭它,這一切來自于混亂的倉庫/版本/依賴管理和糟糕的ide插件支援。
我曾經發過文章描述了我的需求和對maven的期待以及遇到的實際問題,newsmth上有個網友說我應該用maven1而不是maven2,我越核計越覺得不對勁,雖然那時我剛用maven,了解到的反對聲音貌似很少,但是現在看看,随着對maven了解的增多,我也同時聽到了越來越多的質疑聲音。
主要的問題有如下幾個:
第一:舉例說,你有個一依賴A用到了spring-2.0.5;後來spring在倉庫換地方了(這種事情太多了,看看maven混亂的倉庫吧),而你需要的是最新的spring2.5.1,那麼你編譯的時候就會同時有一堆spring2.0.5的檔案和spring2.5的檔案;那麼你需要手動的排除2.0.5的相關資源。問題是在maven體系裡面,這種情況非常常見,大量的依賴混在一起的時候,你看着mvn install之後lib檔案夾下亂七八糟的jar真是欲哭無淚啊,很多jar是同一個庫的不同的版本,這些版本的依賴可能還不同,導緻問題進一步的惡化。
第二:從eclipse的maven插件來說,add dependency的時候,一旦倉庫更新了,你根本看不到最新的檔案是是什麼,比如struts2現在是2.0.11,但是你搜尋的時候隻能看到2.0.9,因為我是那個時候裝的;加入了這個dependency之後隻能手動改版本到2.0.11再編譯。
第三:開發者們同步仍然有困難。如果項目依賴一個倉庫裡面沒有的檔案你就完蛋了,手動拷貝到本地目錄是個常見做法,如果你有100個人參與項目我想你要加入一個依賴簡直大家都要崩潰了,比如struts2的json插件這個包。幸好還有artifactory,不過你一遍遍的手動發到私服上也夠煩了。
maven的支援者們,我們是活在現實世界中的生命,maven的思想很好但是java本身缺乏版本管理機制并且maven也沒有切實有效的解決這個問題,隻能靠meta裡面maven檔案夾裡面的描述資訊,這個資訊很多時候沒有經過嚴格測試的(我遇到過幾次了!導緻項目根本沒法編譯過去,那個包的開發人員一定也用的是他自己的私服)!如果再這樣下去我想很多人會崩潰的……
我仍然是maven的使用者,但是我在瞪着眼睛等待一個新的工具,取代maven和ant。