漫畫:工做這麼多年,你竟然不知道 Maven 中 Optional 和 Exclusions 的區別?

歡迎關注筆者的公衆號: 小哈學Java, 專一於推送 Java 領域優質乾貨文章!!html

Maven 依賴排除(Exclusions)

由於 Maven 構建項目具備依賴可傳遞的特性,當你在 pom.xml添加某個依賴時,可能也會引入不須要的依賴到你的項目中,這將會會可能引發以下問題:java

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

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

PS: <exclusions>須要在具體的依賴上顯示指定,針對特定的 groupIdartifactIdsql

如何使用呢?

<dependency>節點中添加<exclusions>,指定你想要排除的依賴,以下所示:數據庫

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- 在這裏聲明,將項目A中的項目B依賴排除 -->
          <groupId>sample.ProjectB</groupId>
          <artifactId>Project-B</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>
  </dependencies>
</project>
複製代碼

Maven 可選依賴 (Optional)

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

這個時候,某個用戶使用了你的框架,而他僅須要使用數據庫 MySQL,由於 Maven 構建項目具備依賴可傳遞的特性,致使了項目打包時,引入了不少沒必要要的數據庫驅動,那壓根不是他須要的~安全

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

爲何須要可選依賴項

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

如何使用

<project>
  ...
  <dependencies>
    <!-- 將 mysql 驅動包依賴設置爲可選 -->
    <dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.45</version>
      <optional>true</optional> <!-- optional 的值有 true 和 false 可選 -->
		</dependency>
  </dependencies>
</project>
複製代碼

舉個例子🌰

針對上面的場景,能夠在咱們的持久化框架中,將每一個驅動包依賴均設置爲可選:ide

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

總結

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

它們都是用來排除 Jar 包依賴的,可是做用上倒是有所不一樣。

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

PS: 這期分享到這裏就結束咯,首次採用漫畫文的這種創做方式,真的花了好長時間,但願小夥伴會喜歡這種方式~

能夠的話,但願小夥伴們三連喲,閱讀效果好的話,小哈會創做更多的漫畫文,給技術添點料,讓它稍微有趣一點~

哈哈,下期見~

Ref

maven.apache.org/guides/intr…

www.exception.site/essay/what-…

相關文章
相關標籤/搜索