Maven 簡(jiǎn)介

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