Maven 是 Apache 開源組織奉獻的一個開源項目。Maven 這個詞可以翻譯為“知識的積累”,也可以翻譯為“專家”或“內行”。
Maven 的本質是一個項目管理工具,將項目開發和管理過程抽象成一個項目對象模型(POM)。開發人員只需做一些簡單的配置,就可以批量完成項目的構建、報告和文檔的生成工作。
Maven 是跨平台的,這意味着無論是在 Windows 上,還是在 Linux 或者 Mac 上,都可以使用同樣的命令。
我們一直在不停地尋找避免重復的方法。設計的重復、編碼的重復、文檔的重復,當然還有構建的重復。Maven 最大化地消除了構建的重復,抽象了構建生命周期,並且為絕大部分的構建任務提供了已實現的插件,我們不再需要定義過程,甚至不需要再去實現這些過程中的一些任務。
最簡單的例子是測試,我們沒必要告訴 Maven 去測試,更不需要告訴 Maven 如何運行測試,只需要遵循 Maven 的約定編寫好測試用例,當我們運行構建的時候,這些測試便會自動運行。
想象一下,Maven 抽象了一個完整的構建生命周期模型,這個模型吸取了大量其他的構建腳本和構建工具的優點,總結了大量項目的實際需求。如果遵循這個模型,可以避免很多不必要的錯誤,可以直接使用大量成熟的 Maven 插件來完成我們的任務(很多時候我們可能都不知道自己在使用 Maven 插件)。此外,如果有非常特殊的需求,我們也可以輕松實現自己的插件。
Maven 還有一個優點,它能幫助我們標准化構建過程。在 Maven 之前,十個項目可能有十種構建方式。有了 Maven 之后,所有項目的構建命令都是標准化。
綜上所述,Maven 作為一個構建工具,不僅能幫我們自動化構建,還能夠抽象構建過程,提供構建任務實現;它跨平台,對外提供了一致的操作接口,這一切足以使它成為優秀的、流行的構建工具。
當然,Maven 除了是一個優秀的項目構建方面的管理工具外,還有項目管理相關的其他特殊優勢。比如,項目相關的第三方依賴包,這是每個
Java 程序員不可回避的問題。
每個老程序員都在自己的計算機里有個專門目錄,分類保存過去項目開發過程中使用的第三方 jar 包,需要的時候從里面篩選。新程序員就麻煩了,測試項目的時候,經常會遇到 Class No Found Exception,導致一整天在搜索和重啟中度過。
Maven 可以統一管理所有的依賴 jar,甚至是不同的版本。程序員也可以動態地將自己寫好的模塊打包成 jar 包讓它管理。需要的時候,可以直接通過簡單的描述文件告訴 Maven,它會自動幫助程序員找出來,集成到項目中。並且它提供了中央倉庫,能幫我們自動下載構件。
在這個開源的年代里,幾乎任何 Java 應用都會借用一些第三方的開源類庫,這些類庫都可通過依賴的方式引入到項目中來。
隨着依賴的增多,版本不一致、版本沖突、依賴臃腫等問題都會接踵而來。手工解決這些問題是十分枯燥的,幸運的是 Maven 提供了一個優秀的解決方案,它通過一個坐標系統准確地定位每一個構件(artifact),也就是通過一組坐標 Maven 能夠找到任何一個 Java 類庫(如 jar 文件)。
Maven 給這個類庫世界引入了經緯,讓它們變得有秩序,於是我們可以借助它來有序地管理依賴,輕松地解決那些繁雜的依賴問題。
Maven 還能幫助我們管理原本分散在項目中各個角落的項目信息,包括項目描述、開發者列表、版本控制系統地址、許可證、缺陷管理系統地址等。這些微小的變化看起來很瑣碎,並不起眼,但卻在不知不覺中為我們節省了大量尋找信息的時間。
除了直接的項目信息,通過 Maven 自動生成的站點,以及一些已有的插件,我們還能夠輕松獲得項目文檔、測試報告、靜態分析報告、源碼版本日志報告等非常具有價值的項目信息。
Maven 還為全世界的 Java 開發者提供了一個免費的中央倉庫,在其中幾乎可以找到任何的流行開源類庫。通過一些 Maven 的衍生工具(如 Nexus),我們還能對其進行快速地搜索。只要定位了坐標,Maven 就能夠幫我們自動下載,省去了手工勞動。
使用 Maven 還能享受一個額外的好處,即 Maven 對於項目目錄結構、測試用例命名方式等內容都有既定的規則,只要遵循了這些成熟的規則,用戶在項目間切換的時候就免去了額外的學習成本,可以說是約定優於配置(Convention Over Configuration)。
總結一下,Maven 的作用如下:
- Maven 統一集中管理好所有的依賴包,不需要程序員再去尋找。
- 對應第三方組件用到的共同 jar,Maven 自動解決重復和沖突問題。
- Maven 作為一個開放的架構,提供了公共接口,方便同第三方插件集成。程序員可以將自己需要的插件,動態地集成到 Maven,從而擴展新的管理功能。
- Maven 可以統一每個項目的構建過程,實現不同項目的兼容性管理。
