漫畫談一下Maven依賴,百分之90的同學(xué)不知道!
Maven 依賴排除(Exclusions)
因?yàn)?Maven 構(gòu)建的項(xiàng)目具有依賴可傳遞的特性,當(dāng)你在 pom.xml
添加某個依賴時,可能也會引入不需要的依賴到你的項(xiàng)目中,這將會會可能引起如下問題:
-
Jar
包版本沖突,如老版本Jar
包缺失某個方法; -
JDK 版本不兼容; -
老版本存在安全漏洞; -
...
為了解決這些問題,Maven 容許你通過 <exclusions>
來排除你不想要的依賴。這樣,在你構(gòu)建項(xiàng)目時,這些個排除依賴,將不會被打包進(jìn)你的項(xiàng)目中。
PS:
<exclusions>
需要在具體的依賴上顯示指定,針對特定的groupId
和artifactId
。
如何使用呢?
在 <dependency>
節(jié)點(diǎn)中添加<exclusions>
,指定你想要排除的依賴,如下所示:
<project>
...
<dependencies>
<dependency>
<groupId>sample.ProjectA</groupId>
<artifactId>Project-A</artifactId>
<version>1.0</version>
<scope>compile</scope>
<exclusions>
<exclusion> <!-- 在這里聲明,將項(xiàng)目A中的項(xiàng)目B依賴排除 -->
<groupId>sample.ProjectB</groupId>
<artifactId>Project-B</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
Maven 可選依賴 (Optional)
Maven 的可選依賴其實(shí)很好理解,我舉個例子,你就明白了!假設(shè)你想做一個類似 Mybatis
的持久化框架,那你就得支持豐富的數(shù)據(jù)庫吧,如:MySql
、 Oracle
不同版本、 PostgreSQL
等,這樣才會有更多的用戶使用你的框架。這樣的話,你就不得不在你開發(fā)的持久化框架里引入種類繁多的數(shù)據(jù)庫驅(qū)動包。
這個時候,某個用戶使用了你的框架,而他用的是 MySQL
數(shù)據(jù)庫,因?yàn)?Maven 構(gòu)建項(xiàng)目具有依賴可傳遞的特性,導(dǎo)致了項(xiàng)目打包時,引入了很多不必要的數(shù)據(jù)庫驅(qū)動,那壓根不是他需要的~
當(dāng)某個依賴的 <optional>
被定義為 true
后,該依賴便只能在本項(xiàng)目中傳遞,不會被傳遞到引用該依賴的父項(xiàng)目中,父項(xiàng)目需要主動引用才行。
為什么需要可選依賴項(xiàng)
可選依賴項(xiàng)可以幫助項(xiàng)目節(jié)省空間與內(nèi)存,亦可防止將許可協(xié)議的依賴構(gòu)建到 WAR
, EAR
, fat
jar 等包中。
如何使用
<project>
...
<dependencies>
<!-- 將 mysql 驅(qū)動包依賴設(shè)置為可選 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
<optional>true</optional> <!-- optional 的值有 true 和 false 可選 -->
</dependency>
</dependencies>
</project>
舉個例子
針對上面的場景,可以在我們的持久化框架中,將每個驅(qū)動包依賴均設(shè)置為可選:
這時,假設(shè)有個 ProjectA 項(xiàng)目需要使用這個持久化框架,數(shù)據(jù)庫使用的 Mysql
, 那么它還需要在 ProjectA 項(xiàng)目中,重新添加 Mysql
驅(qū)動依賴:
總結(jié)
最后,我們總結(jié)下 Maven 中的 <optional>
與 <exclusions>
的區(qū)別:
它們都是用來排除 Jar 包依賴的,但是作用上卻是有所不同。
-
依賴被定義為 optional
可選,那么依賴只能在該項(xiàng)目中傳遞,并不會被傳遞到引用該項(xiàng)目的父項(xiàng)目中,父項(xiàng)目需要重新引用該依賴才可以。 -
exclusions
則是排除子項(xiàng)目中傳遞過來的依賴。
Ref
http://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:
長按訂閱更多精彩▼
如有收獲,點(diǎn)個在看,誠摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!