maven中scope、optional標籤詳解

maven中scope標籤詳解

maven也是約定大於配置,所以在maven中,很多內容都有默認值,scope的默認值是compile,那麼scope還能有哪些選項呢?
scope的分類
1.compile:默認值 他表示被依賴項目需要參與當前項目的編譯,還有後續的測試,運行週期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去

2.test:依賴項目僅僅參與測試相關的工作,包括測試代碼的編譯和執行,不會被打包,例如:junit

3.runtime:表示被依賴項目無需參與項目的編譯,不過後期的測試和運行週期需要其參與。與compile相比,跳過了編譯而已。例如JDBC驅動,適用運行和測試階段

4.provided:打包的時候可以不用包進去,別的設施會提供。事實上該依賴理論上可以參與編譯,測試,運行等週期。相當於compile,但是打包階段做了exclude操作

5.system:從參與度來說,和provided相同,不過被依賴項不會從maven倉庫下載,而是從本地文件系統拿。需要添加systemPath的屬性來定義路徑

scope的依賴傳遞
A依賴B,B依賴C。當前項目爲A,只當B在A項目中的scope,那麼c在A中的scope是如何得知呢?

當C是test或者provided時,C直接被丟棄,A不依賴C;(排除傳遞依賴)

否則A依賴C,C的scope繼承於B的scope

在優化過程中,我們把部分依賴加上scope標籤,也就是說,避免了最後打包階段把一些已經提供的包排除在外,去掉重複的打包過程,提高效率

轉自:https://blog.csdn.net/cd18333612683/article/details/66478332

Maven 中true和provided之間的區別

依賴管理是maven提供的主要功能之一。無論我們需要什麼依賴,我們只需將它們添加到POM.xml中。由於maven,所有必要的類和資源都會自動添加到項目的classpath中。

在添加依賴項時,我們可以使用optional標誌,或將scope設置爲“provided”。在這兩種情況下,依賴關係都將在聲明它們的模塊的classpath中,但是使用將它們定義爲依賴關係的模塊不會在其他項目中傳遞它們,即不會形成依賴傳遞。
從語義來上理解
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

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