maven是java里面最常見(jiàn)的包管理器,在包管理方面前端與之類似的是JS的npm。相對(duì)于java,js的包管理起步無(wú)疑要晚很多憔购,相對(duì)的也就很多借鑒的地方,下面就用類比的方式來(lái)談一下maven的一些基本知識(shí)岔帽。
與package.json相對(duì)應(yīng)的是pom.xml,也就是一個(gè)項(xiàng)目的描述导绷,通過(guò)groupId犀勒,artifactId和version三個(gè)屬性可以決定該引用的唯一性,與此同時(shí)妥曲,該項(xiàng)目相關(guān)依賴都在dependencies標(biāo)簽下面贾费。
與js的dev- dependencies相對(duì)的是pom里面的包可以配置對(duì)應(yīng)的scope,在不同的場(chǎng)景下使用檐盟。
對(duì)應(yīng)的褂萧,一個(gè)項(xiàng)目的依賴也是一個(gè)樹(shù)形的結(jié)構(gòu)。
出于離線開(kāi)發(fā)的考慮葵萎,在npm i或者刷新maven的時(shí)候导犹,相關(guān)的依賴包就會(huì)被下載到本地包唱凯。如果偷懶,大可以就按照每個(gè)依賴一直往深處下載谎痢,直到最后一層磕昼。但這樣是很不明智且浪費(fèi)空間的做法。(早期的npm就不夠智能)例如上圖节猿,B和D都依賴C票从,沒(méi)有必要下載兩次C。
現(xiàn)在的npm是會(huì)比較版本滨嘱,相同版本的包只會(huì)下載一次峰鄙,不同的再采用不同的包。但是java的包系統(tǒng)和js不同的地方在于java引入外部包的時(shí)候是會(huì)把外部包的路徑加到環(huán)境變量中去尋找太雨,這樣包名具有唯一性吟榴,所以在兩個(gè)依賴的包版本不一樣的時(shí)候就會(huì)出現(xiàn)所謂的包沖突。
maven的包管理出現(xiàn)兩個(gè)沖突時(shí)遵循兩個(gè)原則:
- 深度不一樣的情況選擇路徑短的
-
路徑深度相同的情況選擇先出現(xiàn)的
兩種情況優(yōu)先選擇的情況在上圖都用紅色標(biāo)記出來(lái)了躺彬,換言之可以理解為一個(gè)從上到下的廣度優(yōu)先遍歷煤墙。
關(guān)于maven包管理的基本信息目前只了解到這里,maven與npm不同的是自帶了很完善的生命周期宪拥,而前端要做一些操作只能自己去寫(xiě)npm script仿野,后續(xù)更多關(guān)于maven的使用了解之后再細(xì)說(shuō)。