Maven 中<optional>true</optional>和<scope>provided</scope>之間的區別(轉)

原文:https://segmentfault.com/a/1190000019266080?utm_source=tag-newest

<optional>true</optional>和<scope>provided</scope> 有什麼區別呢?

從語義來上理解
optional
可選的,可以理解爲此功能/此依賴可選,如果不需要某項功能,可以不引用這個包。

scope provided
提供的,可以理解爲此包不由我直接提供,需要調用者/容器提供。

舉個例子說明二者的使用場景和區別
optional
現開發了一個類似Hibernate的框架,叫Summer吧,致敬下Spring,提供了多種數據庫方言的支持:mysql/oracle/db2/postgresql…
每種數據庫支持也獨立了一個module,Summer的依賴中配置了每種數據庫的支持包:summer-mysql-support/summer-oracle-support…

但是實際引用此框架/依賴時,並不需要所有數據庫方言的支持。此時可以把數據庫的支持包都配置爲可選的true。
引用此框架時,只需按需引入自己需要的方言支持包即可,避免了冗餘繁雜的依賴,也降低了jar包衝突的風險。

scope provided
現有一普通Web工程,必然會用到servlet-api這個包。但是實際上這個包一定是由容器提供的,因爲我們這個web會部署到容器內,容器會提供servlet-api,如果此時項目中再引用的話就會造成重複引用,會有版本不一致的風險。

總結
二者從功能來看,都做到了依賴不傳遞。但在語義上表示不同,使用時按場景選擇就好。

出自:https://segmentfault.com/a/1190000019266080?utm_source=tag-newest

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章