1. 程式人生 > >maven中scope標籤詳解

maven中scope標籤詳解

scope的分類

compile(編譯範圍)

預設就是compile,什麼都不配置也就是意味著compile。compile表示被依賴專案需要參與當前專案的編譯,當然後續的測試

執行週期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去。

test(測試範圍)

scope為test表示依賴專案僅僅參與測試相關的工作,包括測試程式碼的編譯,執行。比較典型的如junit。

runntime(執行時範圍)

runntime表示被依賴專案無需參與專案的編譯,不過後期的測試和執行週期需要其參與。與compile相比,跳過編譯而已,

說實話在終端的專案(非開源,企業內部系統)中,和compile區別不是很大。比較常見的如JSR×××的實現,對應的API jar是compile的,

具體實現是runtime的,compile只需要知道介面就足夠了。Oracle jdbc驅動架包就是一個很好的例子,一般scope為runntime。

另外runntime的依賴通常和optional搭配使用,optional為true。我可以用A實現,也可以用B實現。

provided(已提供範圍)

provided意味著打包的時候可以不用包進去,別的設施(Web Container)會提供。事實上該依賴理論上可以參與編譯,測試,執行等週期。相當於compile,但是在打包階段做了exclude的動作。

例如, 如果你開發了一個web 應用,你可能在編譯 classpath 中需要可用的Servlet API 來編譯一個servlet,但是你不會想要在打包好的WAR 中包含這個Servlet API;

這個Servlet API JAR 由你的應用伺服器或者servlet 容器提供。已提供範圍的依賴在編譯classpath (不是執行時)可用。它們不是傳遞性的,也不會被打包。

system(系統範圍)

system範圍依賴與provided 類似,但是你必須顯式的提供一個對於本地系統中JAR 檔案的路徑。這麼做是為了允許基於本地物件編譯,

而這些物件是系統類庫的一部分。這樣的構件應該是一直可用的,Maven 也不會在倉庫中去尋找它。如果你將一個依賴範圍設定成系統範圍,

你必須同時提供一個 systemPath 元素。注意該範圍是不推薦使用的(你應該一直儘量去從公共或定製的 Maven 倉庫中引用依賴)。

scope的依賴傳遞

A–>B–>C。當前專案為A,A依賴於B,B依賴於C。知道B在A專案中的scope,那麼怎麼知道C在A中的scope呢?答案是:  當C是test或者provided時,C直接被丟棄,A不依賴C;  否則A依賴C,C的scope繼承於B的scope。

下面是一張nexus畫的圖。 依賴傳遞時scope的計算