目的:
- 控制依賴傳遞 :將依賴標記為可選,這樣當其他模塊依賴common-component時,不會自動繼承Elasticsearch依賴。這遵循了"依賴最小化"原則,避免不必要的庫被引入到不需要它們的模塊中。
- 模塊化設計 :jetlinks框架采用模塊化設計,common-component作為通用基礎組件,不應該強制所有使用它的模塊都引入Elasticsearch相關功能。通過optional配置,實現了功能的可選性和靈活性。
- 避免版本沖突 :防止多個模塊引入不同版本的Elasticsearch庫導致沖突,讓實際需要Elasticsearch的模塊自行管理其依賴版本。
示例:
common 模塊有這么個依賴
<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><optional>true</optional>
</dependency>
模塊A引入了 common模塊
<dependency><groupId>org.jetlinks.pro</groupId><artifactId>common-component</artifactId><version>${project.version}</version></dependency>
此時 common的 elasticsearch 依賴不會傳遞給 A,也就是說 A 是沒有 elasticsearch 依賴的,想要這個依賴需要自己單獨再引入 elasticsearch,如果想要繼承 common 的 elasticsearch,那就去掉 optional 標簽即可
【另一種情況】
common 模塊的 elasticsearch 去掉了 optional 標簽,模塊 A 引入了 common,同時模塊A自己又單獨引入了 elasticsearch ,此時會發生依賴沖突嗎?
- 如果兩處的 elasticsearch 版本一致,則不會,maven會優先使用模塊A自己的 elasticsearch 依賴
- 如果兩處的版本不一致,則會發生依賴沖突
如果發生了沖突,又不能修改 common 的 pom 文件,我們想用自己引入的依賴,可以選擇在引入 common 時排除 common 模塊的elasticsearch
<dependency><groupId>org.jetlinks.pro</groupId><artifactId>common-component</artifactId><version>${project.version}</version><exclusions><!-- 排除common-component中的r2dbc-spi依賴,使用本模塊中直接聲明的版本 --><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion></exclusions></dependency>