1. 程式人生 > >漫畫:工作這麼多年,你居然不知道 Maven 中 Optional 和 Exclusions 的區別?

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

Maven 依賴排除(Exclusions)

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

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

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

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

artifactId

如何使用呢?

<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等,這樣才會有更多的使用者使用你的框架。這樣的話,你就不得不在你開發的持久化框架裡引入種類繁多的資料庫驅動包。

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

當某個依賴的 <optional>

被定義為 true後,該依賴便只能在本專案中傳遞,不會被傳遞到引用該依賴的父專案中,父專案需要主動引用才行。

為什麼需要可選依賴項

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

如何使用

<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>

舉個例子