maven是java里面最常見的包管理器,在包管理方面前端與之類似的是JS的npm。相對于java,js的包管理起步無疑要晚很多,相對的也就很多借鑒的地方,下面就用類比的方式來談一下maven的一些基本知識。
與package.json相對應的是pom.xml,也就是一個項目的描述,通過groupId,artifactId和version三個屬性可以決定該引用的唯一性,與此同時,該項目相關(guān)依賴都在dependencies標簽下面。
與js的dev- dependencies相對的是pom里面的包可以配置對應的scope,在不同的場景下使用。
對應的,一個項目的依賴也是一個樹形的結(jié)構(gòu)。

IMG_5F08E1C35883-1.jpeg
出于離線開發(fā)的考慮,在npm i或者刷新maven的時候,相關(guān)的依賴包就會被下載到本地包。如果偷懶,大可以就按照每個依賴一直往深處下載,直到最后一層。但這樣是很不明智且浪費空間的做法。(早期的npm就不夠智能)例如上圖,B和D都依賴C,沒有必要下載兩次C。
現(xiàn)在的npm是會比較版本,相同版本的包只會下載一次,不同的再采用不同的包。但是java的包系統(tǒng)和js不同的地方在于java引入外部包的時候是會把外部包的路徑加到環(huán)境變量中去尋找,這樣包名具有唯一性,所以在兩個依賴的包版本不一樣的時候就會出現(xiàn)所謂的包沖突。
maven的包管理出現(xiàn)兩個沖突時遵循兩個原則:
- 深度不一樣的情況選擇路徑短的
-
路徑深度相同的情況選擇先出現(xiàn)的
兩種情況優(yōu)先選擇的情況在上圖都用紅色標記出來了,換言之可以理解為一個從上到下的廣度優(yōu)先遍歷。

IMG_B2F6404F8424-1.jpeg
關(guān)于maven包管理的基本信息目前只了解到這里,maven與npm不同的是自帶了很完善的生命周期,而前端要做一些操作只能自己去寫npm script,后續(xù)更多關(guān)于maven的使用了解之后再細說。