【Maven官網文件】Optional & Exclusion Maven中的可選依賴和依賴性排除
本節介紹Maven中的可選依賴和依賴性排除功能。 【原文連結】
Optional 依賴
如果明確一個 project 無論出於什麼原因考慮都不可能繼續分割成子專案,則其依賴可以使用 optional。 如果其他 project 依賴了 使用 optional 的 project, 則他們需要自主選擇該依賴,亦即是說,該 optional 依賴不會通過傳遞性依賴傳遞給上層的 project。
為什麼要使用 optional 依賴?
如果是為了節省記憶體空間大可不必如此選擇optional依賴。原因是,使用一個 project,控制其依賴list是很重要的,因為這些依賴最後可能都會打包成 war、jar 等等,可能會違反許可協議或者引起類路徑問題。
如何使用 optional 依賴?
在你的 dependency 中將屬性 <optional>設定為true即可。projectA的依賴如下:
<project>
...
<dependencies>
<!-- 宣告設定為optional的依賴項 -->
<dependency>
<groupId>sample.ProjectB</groupId>
<artifactId>Project-B</artifactId>
<version >1.0</version>
<scope>compile</scope>
<optional>true</optional> <!-- 僅僅支援true、false -->
</dependency>
</dependencies>
</project>
optional 是怎麼工作的?
Project-A -> Project-B
上面的這幅圖表示了,projetA依賴於projectB, 且 projectB的設定為依賴可選項為true。
Project-X -> Project-A
假如現在有另一個peojectX依賴於projectA 時,optional 設定就生效了,你會發現 projectX 並沒有依賴於 projectB,你必須直接在 projectX 的pom中依賴 projectB。 也就是在以下的依賴鏈中:
Project-X -> Project-A -> Project-B
Project-B 失去了傳遞依賴性。
Exclusions 依賴
Maven 是解決依賴關係的,在你的專案類路徑中可能包含不必要的依賴。例如,你所依賴的專案可能並沒有正確的宣告他們的依賴。為了解決這個情況,maven 2.x 包含了顯示排除依賴的概念exclusion。 Exclusions 用於排除在你的pom中的某個指定的依賴,當你build你的project時,這個依賴不會打包到你的類路徑下。
如何使用 exclusion依賴?
<project>
...
<dependencies>
<dependency>
<groupId>sample.ProjectA</groupId>
<artifactId>Project-A</artifactId>
<version>1.0</version>
<scope>compile</scope>
<exclusions>
<exclusion> <!-- 宣告排除依賴 -->
<groupId>sample.ProjectB</groupId>
<artifactId>Project-B</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
ProjectX 依賴於 ProjectA, ProjectA 依賴於ProjectB,在 ProjectX 的pom中將ProjectA的dependency中新增ProjectB的排除依賴。這樣ProjectB就不會在構建的時候打包到ProjectX的類路徑中的。
要完成此功能一樣的效果,你也可以在ProjectA中將ProjectB的optional設定為true。
Optional 和 Exclusions 依賴的總結
- Optional 是保證依賴向上不擴散
- Exclusions 是排除依賴的子(孫…)依賴關係