漫畫:工作這麼多年,你居然不知道 Maven 中 Optional 和 Exclusions 的區別?
阿新 • • 發佈:2020-04-22
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
的持久化框架,那你就得支援豐富的資料庫吧,如:MySql
、 Oracle
不同版本、 PostgreSQL
等,這樣才會有更多的使用者使用你的框架。這樣的話,你就不得不在你開發的持久化框架裡引入種類繁多的資料庫驅動包。
這個時候,某個使用者使用了你的框架,而他僅需要使用資料庫 MySQL
,因為 Maven 構建專案具有依賴可傳遞的特性,導致了專案打包時,引入了很多不必要的資料庫驅動,那壓根不是他需要的~
當某個依賴的 <optional>
true
後,該依賴便只能在本專案中傳遞,不會被傳遞到引用該依賴的父專案中,父專案需要主動引用才行。
為什麼需要可選依賴項
可選依賴項可以幫助專案節省空間與記憶體,亦可防止將許可協議的依賴構建到 WAR
, EAR
, fat
jar 等包中。
如何使用
<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>