漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?

漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


Maven 依賴排除(Exclusions)

因為 Maven 構建項目具有依賴可傳遞的特性,當你在 pom.xml添加某個依賴時,可能也會引入不需要的依賴到你的項目中,這將會會可能引起如下問題:

  • Jar包版本衝突,如老版本Jar包缺失某個方法;
  • JDK 版本不兼容;
  • 老版本存在安全漏洞;
  • ...

為了解決這些問題,Maven 容許你通過 <exclusions>來排除你不想要的依賴。這樣,在你構建項目時,這些被排除依賴,將不會被打包進你的項目中。/<exclusions>

PS: <exclusions>需要在具體的依賴上顯示指定,針對特定的 groupId和artifactId。/<exclusions>

如何使用呢?

在 <dependency>節點中添加<exclusions>,指定你想要排除的依賴,如下所示:/<exclusions>/<dependency>

<code><project>
...
<dependencies>

<dependency>
<groupid>sample.ProjectA/<groupid>
<artifactid>Project-A/<artifactid>
<version>1.0/<version>
<scope>compile/<scope>
<exclusions>
<exclusion>
<groupid>sample.ProjectB/<groupid>
<artifactid>Project-B/<artifactid>
/<exclusion>
/<exclusions>
/<dependency>
/<dependencies>
/<project>
複製代碼/<code>


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


Maven 可選依賴 (Optional)

Maven 的可選依賴其實很好理解,我舉個例子,你就明白了!假設你想做一個類似 Mybatis的持久化框架,那你就得支持豐富的數據庫吧,如:MySql、 Oracle不同版本、 PostgreSQL等,這樣才會有更多的用戶使用你的框架。這樣的話,你就不得不在你開發的持久化框架裡引入種類繁多的數據庫驅動包。

這個時候,某個用戶使用了你的框架,而他僅需要使用數據庫 MySQL,因為 Maven 構建項目具有依賴可傳遞的特性,導致了項目打包時,引入了很多不必要的數據庫驅動,那壓根不是他需要的~


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


當某個依賴的 <optional>被定義為 true後,該依賴便只能在本項目中傳遞,不會被傳遞到引用該依賴的父項目中,父項目需要主動引用才行。/<optional>

為什麼需要可選依賴項

可選依賴項可以幫助項目節省空間與內存,亦可防止將許可協議的依賴構建到 WAR, EAR, fatjar 等包中。

如何使用

<code><project>
...
<dependencies>

<dependency>
\t\t\t<groupid>mysql/<groupid>
\t\t\t<artifactid>mysql-connector-java/<artifactid>
\t\t\t<version>5.1.45/<version>
<optional>true/<optional>
\t\t/<dependency>
/<dependencies>
/<project>
複製代碼/<code>

舉個例子

針對上面的場景,可以在我們的持久化框架中,將每個驅動包依賴均設置為可選:


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


這時,假設有個 ProjectA 項目需要使用這個持久化框架,數據庫使用的 Mysql, 那麼它還需要在 ProjectA 項目中,重新添加 Mysql 驅動依賴:


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


漫畫:你居然不知道 Maven 中 Optional 和 Exclusions 的區別?


總結

最後,我們總結下 Maven 中的 <optional> 與 <exclusions>的區別:/<exclusions>/<optional>

它們都是用來排除 Jar 包依賴的,但是作用上卻是有所不同。

  • 依賴被定義為 optional 可選,那麼依賴只能在該項目中傳遞,並不會被傳遞到引用該項目的父項目中,父項目需要重新引用該依賴才可以。
  • exclusions 則是排除子項目中傳遞過來的依賴。


作者:犬小哈
鏈接:https://juejin.im/post/5e9ff0916fb9a03c2f4e2581


分享到:


相關文章: