Maven 簡介

1. 什么是 Maven?
那究竟什么是 Maven 呢,在 Maven 的官網上可以看到如下的解釋:
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.
翻譯過來就是:Maven 是一個軟件工程的項目管理工具,基于工程對象模型(POM),Maven 可以從中央信息篇中來構建項目,生成報告和文檔。
從上面的介紹中,我們可以看到 Maven 的主要功能是管理項目,構建項目。
關于 Maven 的由來,據其創始人者 Jason Van Zyl 描述,是為了更加便利地建設 Jakarta Turbine 項目而創立的一個項目。在當時,比較流行的項目構建工具是 Ant,但是,在這個階段中,各種 Java 項目之間是沒有什么規范的,新創建項目的時候,就需要重新編寫對應的構建腳本。Jason 就相對應設計出一套標準的項目結構,標準的構建方式,用來簡化項目的構建。2003 年的時候,Maven 已經是 Apache 基金會的頂級項目了。
2. Maven 的優缺點
很多著名的項目,都是歷史的產物。在當時,隨著 Java 語言的流行,越來越多的項目開始使用 Java ,但是當時的構建工具并不能簡單快速地完成項目構建的流程,在這種背景下,一個簡單,方便,標準化的構建工具-- Maven 就產生了。
2.1 Maven的優點
從 Maven 的官網中我們就可以看到以下幾個特點:
-
Making the build process easy:意思是簡化構建過程,顧名思義,讓構建的過程來得更簡單;
-
Providing a uniform build system:意思是提供統一的構建系統,Maven 提供了一個統一的構建系統。例如:Maven 使用 POM 模型以及一系列的相關插件供開發者來使用;
-
Providing quality project information:意思是提供優質的項目信息,在使用 Maven 的過程中,你可以通過 Maven 來獲得很多關于項目的信息,例如:已經覆蓋的單元測試報告,項目的依賴列表等等;
-
Providing guidelines for best practices development:意思是提供最佳實踐開發指南,Maven 致力于整合開發過程中的最佳實踐,并引導人們朝著這個方法前進。例如:在項目過程中 Release 版本和 snapshot 版本的管理,以及 Maven 項目標準化的項目目錄結構。
總之呢,Maven 的核心是約定大于配置,它的初衷就是幫助程序開發者在最短時間內完成項目開發過程中的每個過程,目標就是更簡單,更統一,更快速。
2.2 Maven 的缺點
- Maven 的整個體系相對龐大,想要完全掌握相對困難;
- 如果項目的依賴過多,在第一次導入項目的時候需要花很長的時間來加載所需要的依賴;
- 由于某種不可抗拒力,國內的開發者在使用 Maven 中央倉庫的時候,下載速度過慢。
但是,這些問題都是有可以有解決辦法的,我們后續會慢慢一一介紹。
2.3 相同類型工具對比
在 Java 開發的世界中,有三大主流的構建工具,分別是 Ant ,Maven ,Gradle。
其中 Ant 出現的世界最早,能夠提供編譯、測試、打包的功能,但是 Ant 缺乏對依賴的管理,以及標準的項目結構。
后來 Maven 的出現,解決了 Ant 所不能滿足的兩個問題,從創建項目到構建及發布項目的整個過程定義了一套完整的規范,并且提供中央倉庫,對依賴進行管理。
后來,隨著 Android 的流行,近年來,以 Gradle 作為項目的構建工具也越來越流行。Gradle 在 Maven 的基礎上,使用基于 Groovy 的特定領域語言(DSL)來完成配置聲明,相較于 XML 來說,更加靈活。
目前,Maven 和 Gradle 基本上算是平分秋色的局面,在實際的開發中,后臺項目管理更傾向于使用 Maven,而在移動端開發中,Gradle 的占比更大。當然兩者之間也有很多相通的地方,比如依賴管理,一致的項目結構。
3. Maven 的版本
Maven 從發布到現在已經經歷過很多個版本迭代,目前最新的版本是 2019-11-25 發布的 Maven 3.6.3 版本。
- 1.0-2.x : 官方不再進行維護,也不建議開發者使用;
- 3.0: Maven3.x 的第一個版本,也算是 Maven 的里程碑版本,完全向后兼容 Maven2,增加了 SLF4J 來進行日志管理,并且提高了項目構建效率和插件的擴展性;
- 3.5.0: 該版本顯著的變化是 Maven 的控制臺支持不同級別日志輸出不同顏色;
- 3.6.3: 目前的最新版本,schemaLocations 地址支持 https。在后續的章節中,我們也會用這個版本來進行講解。
4. 為什么使用 Maven?
說到這個問題,我們首先要看一下,如果沒有 Maven,那么我們的工作是什么樣子的呢?
場景一
當我們在開發過程中,當我們開發某個新功能或者修復了某個 Bug,都需要手動進行整個項目編譯,運行單元測試,生成項目文檔,打包,部署環境這些步驟。一旦需要重新修改代碼的時候,便要將上述的操作重復一遍。機械性的重復勞動充斥著整個開發過程;
場景二
由于不同的人可能會有不同的習慣或者說是個人偏好,每當我們新建一個項目的時候,所建出來的項目可能會千奇百怪,這也給后續的維護升級帶來了諸多的不便;
場景三
當項目需要依賴某個 jar 包的時候,需要到互聯網上去尋找對應的 jar 包,找到 jar 包之后,將這個 jar 包添加到項目的 lib 目錄下,項目組里面不同的人可能會找到不同的 jar 包,不同的 jar 包直接可能會存在沖突,這個時候,就需要去手動解決沖突;
看到這里,只想說一句,我太難了。但是,不要慌,Maven 的存在,就是為了幫助解決這些問題。
使用 Maven 之后,只需要執行一個命令就可以完成編譯,運行單元測試,打包,部署的整個流程;并且 Maven 以 POM 的形式來管理 jar 包依賴;還有一點就是,使用 Maven 構建出的項目,結構統一,方便后續的維護升級。
5. 學習基礎
本教程當中使用了一些 Java 項目作為例子,所以需要了解簡單的 Java 基礎。
6. 本課程如何設計?
在本課程中,我們首先會對 Maven 的核心概念進行講解,并且,通過一些簡單的項目,來加深對這些概念的理解,在課程的過程中,如果遇到平時工作時常使用的點,則會穿插一些實際工作中的最佳實踐,方便在工作中能夠學以致用。