Maven開(kāi)發(fā)筆記(二)—— Maven中的可選依賴(Optional Dependencies)和依賴排除(Dependency Exclusions)

1.Maven中依賴概述

Maven 中的依賴關(guān)系是有傳遞性的嘶窄。例如:項(xiàng)目B依賴項(xiàng)目C(B —> C)坎吻,如果有一個(gè)項(xiàng)目A依賴項(xiàng)目B(A —> B)的話硬霍,那么項(xiàng)目A也會(huì)依賴項(xiàng)目C(A —> C)。雖然井佑,這種依賴的自動(dòng)傳遞性給我們維護(hù)項(xiàng)目的必要依賴關(guān)系帶來(lái)了極大地幫助,但當(dāng)我們?cè)谀承┣闆r下眠寿,需要在項(xiàng)目A中排除對(duì)項(xiàng)目C的依賴時(shí)躬翁,這時(shí)又該怎么做呢?Maven 為我們提供了兩種解決方案澜公,分別是可選依賴(Optional Dependencies)和依賴排除(Dependency Exclusions)姆另。

2.哪些場(chǎng)景需要排除依賴

我們繼續(xù)用上文中的例子,雖然項(xiàng)目A依賴項(xiàng)目B坟乾,但當(dāng)項(xiàng)目A不是完全依賴項(xiàng)目B的時(shí)候迹辐,即項(xiàng)目A只用到了項(xiàng)目B的一部分功能,而正巧項(xiàng)目B這部分功能的實(shí)現(xiàn)甚侣,并不需要依賴于項(xiàng)目C明吩,這個(gè)時(shí)候,項(xiàng)目A就應(yīng)該排除對(duì)項(xiàng)目C的依賴殷费。

有的人可能有這樣的疑問(wèn)印荔,為什么要排除對(duì)項(xiàng)目C的依賴呢?就算包含了對(duì)項(xiàng)目C的依賴详羡,也不會(huì)出問(wèn)題啊仍律。事實(shí)上,表面上看確實(shí)不會(huì)出現(xiàn)問(wèn)題实柠。但是水泉,我們必須記住一點(diǎn):當(dāng)我們使用一個(gè)工程時(shí),控制實(shí)際需要的依賴列表非常重要窒盐。而且草则,排除不必要的依賴還可以幫助我們,節(jié)約磁盤蟹漓、內(nèi)存等空間炕横,避免許可協(xié)議問(wèn)題以及類路徑問(wèn)題等。我們?cè)谙硎?strong>Maven依賴的自動(dòng)傳遞性帶給我們的便利的同時(shí)葡粒,要時(shí)刻注意引入冗余份殿、不必要的依賴對(duì)我們項(xiàng)目產(chǎn)生的負(fù)面影響。

3.可選依賴(Optional Dependencies)—— optional

從項(xiàng)目B入手嗽交,使項(xiàng)目A依賴項(xiàng)目B時(shí)伯铣,排除對(duì)項(xiàng)目C的依賴。項(xiàng)目B的配置片段如下:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectC</groupId>
      <artifactId>Project-C</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>
  </dependencies>
</project>

在項(xiàng)目A中按照正常的方式引入對(duì)項(xiàng)目B的依賴即可轮纫,這個(gè)時(shí)候,項(xiàng)目A就不會(huì)依賴項(xiàng)目C了焚鲜。如果項(xiàng)目A用到了項(xiàng)目B中涉及項(xiàng)目C的功能掌唾,則需要在項(xiàng)目A的 pom.xml 文件中額外配置對(duì)項(xiàng)目C的依賴放前。

應(yīng)用場(chǎng)景:假設(shè)有一個(gè)項(xiàng)目X,它實(shí)現(xiàn)了類似Hibernate的功能糯彬,支持很多種數(shù)據(jù)庫(kù)驅(qū)動(dòng)凭语,例如:mysql,oracle等撩扒。我們?cè)跇?gòu)建項(xiàng)目X的時(shí)候似扔,確實(shí)需要所有這些依賴。但設(shè)想搓谆,假如有一個(gè)項(xiàng)目Y想使用項(xiàng)目X提供的功能炒辉,那么它極有可能只使用其中的一種數(shù)據(jù)庫(kù)驅(qū)動(dòng)。這個(gè)時(shí)候泉手,就需要我們?cè)陧?xiàng)目X中將所有和驅(qū)動(dòng)相關(guān)的依賴設(shè)置為可選依賴黔寇。只有這樣,在項(xiàng)目Y中聲明項(xiàng)目X為直接依賴的時(shí)候斩萌,才不會(huì)將項(xiàng)目X的所有關(guān)于驅(qū)動(dòng)的依賴自動(dòng)引入缝裤。這時(shí),項(xiàng)目Y只需要額外聲明自己真正需要依賴的驅(qū)動(dòng)即可颊郎。

4.依賴排除(Dependency Exclusions)—— exclusion

接上文例子憋飞,如果項(xiàng)目B沒(méi)有把項(xiàng)目C設(shè)置為可選依賴(Optional Dependencies),而項(xiàng)目A又想在依賴項(xiàng)目B的同時(shí)不依賴項(xiàng)目C姆吭,應(yīng)該如何操作呢榛做?這個(gè)時(shí)候,我們使用依賴排除(Dependency Exclusions)就可以達(dá)到目的猾编。此時(shí)瘤睹,項(xiàng)目B按照正常的方式引入對(duì)項(xiàng)目C的依賴,項(xiàng)目A在引入對(duì)項(xiàng)目B的依賴時(shí)答倡,配置如下:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectB</groupId>
      <artifactId>Project-B</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion> 
          <groupId>sample.ProjectC</groupId>
          <artifactId>Project-C</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
  </dependencies>
</project>

應(yīng)用場(chǎng)景:接上文例子轰传,假如項(xiàng)目X并沒(méi)有將所有對(duì)驅(qū)動(dòng)的依賴設(shè)置為可選依賴(Optional Dependencies),那么項(xiàng)目Y直接引入對(duì)項(xiàng)目X的依賴時(shí)瘪撇,就會(huì)將項(xiàng)目X中所有對(duì)驅(qū)動(dòng)的依賴一起引入获茬。這時(shí)候,就需要我們?cè)谝腠?xiàng)目X時(shí)通過(guò)依賴排除(Dependency Exclusions)去除掉我們不需要的那些依賴倔既。

需要注意的是恕曲,依賴排除(Dependency Exclusions)是基于單個(gè)依賴的,并不是POM級(jí)別的渤涌。也就是說(shuō)佩谣,雖然,項(xiàng)目A在引入對(duì)項(xiàng)目B的依賴時(shí)实蓬,排除了對(duì)項(xiàng)目C的依賴茸俭。但吊履,并不影響項(xiàng)目A在其他地方引入對(duì)項(xiàng)目C的依賴。例如调鬓,項(xiàng)目A又引入了對(duì)項(xiàng)目D的依賴艇炎,而項(xiàng)目D依賴項(xiàng)目C,這個(gè)時(shí)候腾窝,項(xiàng)目A就又產(chǎn)生了對(duì)項(xiàng)目C的依賴缀踪。

另外,在Maven引入的jar包發(fā)生沖突時(shí)虹脯,也往往需要借助依賴排除(Dependency Exclusions)來(lái)解決驴娃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市归形,隨后出現(xiàn)的幾起案子托慨,更是在濱河造成了極大的恐慌,老刑警劉巖暇榴,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厚棵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蔼紧,警方通過(guò)查閱死者的電腦和手機(jī)婆硬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奸例,“玉大人彬犯,你說(shuō)我怎么就攤上這事〔榈酰” “怎么了谐区?”我有些...
    開(kāi)封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逻卖。 經(jīng)常有香客問(wèn)我宋列,道長(zhǎng),這世上最難降的妖魔是什么评也? 我笑而不...
    開(kāi)封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任炼杖,我火速辦了婚禮,結(jié)果婚禮上盗迟,老公的妹妹穿的比我還像新娘坤邪。我一直安慰自己,他們只是感情好罚缕,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布艇纺。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪黔衡。 梳的紋絲不亂的頭發(fā)上消约,一...
    開(kāi)封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音员帮,去河邊找鬼。 笑死导饲,一個(gè)胖子當(dāng)著我的面吹牛捞高,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播渣锦,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼硝岗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了袋毙?” 一聲冷哼從身側(cè)響起型檀,我...
    開(kāi)封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎听盖,沒(méi)想到半個(gè)月后胀溺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皆看,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年仓坞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腰吟。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡无埃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毛雇,到底是詐尸還是另有隱情嫉称,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布灵疮,位于F島的核電站织阅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏始藕。R本人自食惡果不足惜蒲稳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伍派。 院中可真熱鬧江耀,春花似錦、人聲如沸诉植。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至舌稀,卻和暖如春啊犬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壁查。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工觉至, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人睡腿。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓语御,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親席怪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子应闯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)挂捻,斷路器碉纺,智...
    卡卡羅2017閱讀 134,711評(píng)論 18 139
  • maven項(xiàng)目中需要使用到其它依賴時(shí),則需要在pom.xml中配置<dependency>元素也就是依賴聲明刻撒,這樣...
    zlcook閱讀 1,827評(píng)論 1 3
  • 1.dependency簡(jiǎn)介 dependency 元素用于定義對(duì)其他項(xiàng)目的依賴關(guān)系骨田,其中,常見(jiàn)的子元素有:gro...
    邱士超閱讀 1,577評(píng)論 0 1
  • 我要反省自己疫赎,近段時(shí)間學(xué)習(xí)態(tài)度不認(rèn)真盛撑,有惰性,好偷懶捧搞,沒(méi)有深刻意識(shí)到國(guó)家提供資金培養(yǎng)我抵卫,醫(yī)院提供平臺(tái)讓我學(xué)習(xí),沒(méi)有...
    Cheasy閱讀 271評(píng)論 0 0
  • 大漠風(fēng)沙走胎撇, 浮云四處游介粘。 駝鈴聲已遠(yuǎn), 寂寞小花留晚树。
    金紫緣閱讀 209評(píng)論 0 3