Maven 中true和provided之間的區別

依賴管理是maven提供的主要功能之一。不管咱們須要什麼依賴,咱們只需將它們添加到POM.xml中。因爲maven,全部必要的類和資源都會自動添加到項目的classpath中。html

在添加依賴項時,咱們可使用optional標誌,或將scope設置爲「provided」。在這兩種狀況下,依賴關係都將在聲明它們的模塊的classpath中,可是使用將它們定義爲依賴關係的模塊不會在其餘項目中傳遞它們,即不會造成依賴傳遞。mysql

從語義來上理解

optional

可選的,能夠理解爲此功能/此依賴可選,若是不須要某項功能,能夠不引用這個包。web

scope provided

提供的,能夠理解爲此包不禁我直接提供,須要調用者/容器提供。sql

舉個例子說明兩者的使用場景和區別

optional

現開發了一個相似Hibernate的框架,叫Summer吧,致敬下Spring,提供了多種數據庫方言的支持:mysql/oracle/db2/postgresql...
每種數據庫支持也獨立了一個module,Summer的依賴中配置了每種數據庫的支持包:summer-mysql-support/summer-oracle-support...數據庫

可是實際引用此框架/依賴時,並不須要全部數據庫方言的支持。此時能夠把數據庫的支持包都配置爲可選的<optional>true</optional>
引用此框架時,只需按需引入本身須要的方言支持包便可,避免了冗餘繁雜的依賴,也下降了jar包衝突的風險。apache

scope provided

現有一普通Web工程,必然會用到servlet-api這個包。可是實際上這個包必定是由容器提供的,由於咱們這個web會部署到容器內,容器會提供servlet-api,若是此時項目中再引用的話就會形成重複引用,會有版本不一致的風險。api

總結

兩者從功能來看,都作到了依賴不傳遞。但在語義上表示不一樣,使用時按場景選擇就好。oracle

參考

https://medium.com/@danismaz.furkan/difference-between-optional-true-optional-and-scope-provided-scope-7404ec24fb59
https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope
https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html框架

相關文章
相關標籤/搜索