Maven包管理概述

JVM的工作原理

JVM的設(shè)計(jì)理念極其簡(jiǎn)單口叙,JVM只會(huì)做兩件事情:

  1. 執(zhí)行一個(gè)類的字節(jié)碼
  2. 執(zhí)行這個(gè)類的時(shí)候,若遇到了新的類嗅战,那么就加載它
  3. 不斷重復(fù)以上兩個(gè)過(guò)程妄田,直到結(jié)束

JVM通過(guò)classpath參數(shù)來(lái)獲取加載類的路徑,這些包以冒號(hào)分割驮捍,當(dāng)JVM遇到了依賴的類時(shí)疟呐,就會(huì)去classpath路徑中依次尋找直到找到這個(gè)類為止。

什么是包管理

在沒(méi)有包管理這樣一個(gè)概念時(shí)厌漂,程序員需要手動(dòng)編譯這些類,類之間的相互依賴使得這個(gè)過(guò)程非常的繁瑣斟珊,而且苇倡,還會(huì)出現(xiàn)依賴沖突富纸。于是乎,就出現(xiàn)了包管理的概念
包管理的本質(zhì)就是告訴JVM如何找到所需要的第三方類庫(kù)旨椒,并且陳工地解決依賴沖突的問(wèn)題晓褪。

依賴沖突

在Maven誕生前,依賴沖突是一個(gè)非常容易發(fā)生且難以解決的問(wèn)題综慎。全限定類名是JVM眼中識(shí)別類的唯一標(biāo)識(shí)涣仿,如果多個(gè)同名類的不同版本出現(xiàn)在classpath中,就可能會(huì)帶來(lái)沖突的問(wèn)題示惊,例如:



你的項(xiàng)目依賴了B包和C包的兩個(gè)版本好港,包的依賴路徑被完整地寫(xiě)到了classpath上,JVM會(huì)從前向后在classpath上尋找需要加載的類米罚,所以如果C1包在C2包的前面钧汹,那么JVM就會(huì)忽視C2包,C2包的類是C包的后期版本录择,可能新添加了某些功能拔莱,修復(fù)了一些bug,這樣一來(lái)隘竭,項(xiàng)目就有可能因?yàn)橐蕾嚊_突而出錯(cuò)塘秦。
像以下幾種異常:

  • AbstractMethodError
  • NoClassDefFoundError
  • ClassNotFoundException
  • LinkageError

如果項(xiàng)目中報(bào)了以上的異常,很有可能一個(gè)原因是因?yàn)橐蕾嚊_突引起的动看。

Maven 解決沖突的原則

在了解Maven是如何解決沖突之前尊剔,我們先來(lái)了解一下Maven是如何對(duì)包進(jìn)行管理的
Maven規(guī)定了生產(chǎn)代碼在src/main目錄。測(cè)試代碼在src/test目錄弧圆,這個(gè)是不成文的規(guī)定赋兵,這也是Maven的約定優(yōu)于配置原則(Convention over configuration),在沒(méi)有強(qiáng)制的規(guī)定時(shí)搔预,因?yàn)槊總€(gè)人定義的目錄不同霹期,這就造成了很多問(wèn)題,Maven則強(qiáng)制規(guī)定了這樣的目錄結(jié)構(gòu)拯田。
Maven有中央倉(cāng)庫(kù)以及本地倉(cāng)庫(kù)历造。
本地倉(cāng)庫(kù)默認(rèn)在~/.m2下,這個(gè)目錄存放著下載的第三方包緩存船庇。
中央倉(cāng)庫(kù)則是線上倉(cāng)庫(kù)吭产,通過(guò)groupId,artifactId,version這樣的坐標(biāo)信息定位到我們需要的第三方包
我們?cè)趐om.xml文件中配置好坐標(biāo)信息,Maven就會(huì)自動(dòng)下載這些包以及相關(guān)的依賴包鸭轮,并在本地倉(cāng)庫(kù)中緩存起來(lái)臣淤。
那么 Maven是如何解決包的沖突的呢?
拿之前的例子說(shuō)明:

image.png

Maven會(huì)保留離項(xiàng)目最近的包窃爷,刪去其他的包邑蒋,本示例中姓蜂,離項(xiàng)目最近的包是C2。Maven會(huì)去除掉C1而保留C2,當(dāng)然這種策略也是不完美的医吊,不過(guò)相對(duì)于自己操作實(shí)在是方便多了钱慢。

如何解決Maven的依賴沖突

有的時(shí)候,即便是Maven包管理工具卿堂,還是可能造成項(xiàng)目依賴沖突束莫,解決Maven的沖突有如下幾種辦法:

  1. 直接依賴最高版本


在沒(méi)有添加紅色的依賴時(shí),Maven會(huì)比較C1和C2兩個(gè)包離項(xiàng)目的遠(yuǎn)近草描,之后會(huì)比較先后的次序览绿,所以Maven會(huì)舍棄掉C2包,我們解決這個(gè)沖突最直接的辦法就是陶珠,直接讓該項(xiàng)目依賴C3最高版本的包挟裂,這樣就可以解決掉沖突的問(wèn)題。

  1. 使用exclusions排除保重的后代指定的依賴
<dependency>
  <groupId>xxx</groupId>
  <artifactId>xxx</artifactId>
  <version>1.0.0</version>
  <exclusions>
    <exclusion>
        <groupId>yyy</groupId>
      <artifactId>yyy</artifactId>
    </exclusion>
  </exclusions>
</dependency>

如果使用IDEA可以下載mvn helper 插件更加直觀有效解決包沖突的問(wèn)題揍诽。

參考文章 Java包管理以及Maven包管理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诀蓉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子暑脆,更是在濱河造成了極大的恐慌渠啤,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件添吗,死亡現(xiàn)場(chǎng)離奇詭異沥曹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)碟联,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)妓美,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人鲤孵,你說(shuō)我怎么就攤上這事壶栋。” “怎么了普监?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵贵试,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我凯正,道長(zhǎng)毙玻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任廊散,我火速辦了婚禮桑滩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘允睹。我一直安慰自己运准,他們只是感情好往声,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著戳吝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贯涎。 梳的紋絲不亂的頭發(fā)上听哭,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音塘雳,去河邊找鬼陆盘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛败明,可吹牛的內(nèi)容都是我干的隘马。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妻顶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酸员!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起讳嘱,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤幔嗦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后邀泉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钝鸽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仁连。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓝角。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饭冬,靈堂內(nèi)的尸體忽然破棺而出使鹅,到底是詐尸還是另有隱情,我是刑警寧澤昌抠,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布患朱,位于F島的核電站,受9級(jí)特大地震影響炊苫,放射性物質(zhì)發(fā)生泄漏裁厅。R本人自食惡果不足惜冰沙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望执虹。 院中可真熱鬧拓挥,春花似錦、人聲如沸袋励。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茬故。三九已至盖灸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磺芭,已是汗流浹背赁炎。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钾腺,地道東北人徙垫。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像放棒,于是被迫代替她去往敵國(guó)和親松邪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容