依賴範圍控制哪些依賴在哪些classpath 中可用,哪些依賴包含在一個應用中。讓咱們詳細看一下每一種範圍:web
compile (編譯範圍)
compile是默認的範圍;若是沒有提供一個範圍,那該依賴的範圍就是編譯範圍。編譯範圍依賴在全部的classpath 中可用,同時它們也會被打包。
provided (已提供範圍)
provided 依賴只有在當JDK 或者一個容器已提供該依賴以後才使用。例如, 若是你開發了一個web 應用,你可能在編譯 classpath 中須要可用的Servlet API 來編譯一個servlet,可是你不會想要在打包好的WAR 中包含這個Servlet API;這個Servlet API JAR 由你的應用服務器或者servlet 容器提供。已提供範圍的依賴在編譯classpath (不是運行時)可用。它們不是傳遞性的,也不會被打包。
runtime (運行時範圍)
runtime 依賴在運行和測試系統的時候須要,但在編譯的時候不須要。好比,你可能在編譯的時候只須要JDBC API JAR,而只有在運行的時候才須要JDBC
驅動實現。
test (測試範圍)
test範圍依賴 在通常的編譯和運行時都不須要,它們只有在測試編譯和測試運行階段可用。
system (系統範圍)
system範圍依賴與provided 相似,可是你必須顯式的提供一個對於本地系統中JAR 文件的路徑。這麼作是爲了容許基於本地對象編譯,而這些對象是系統類庫的一部分。這樣的構件應該是一直可用的,Maven 也不會在倉庫中去尋找它。若是你將一個依賴範圍設置成系統範圍,你必須同時提供一個 systemPath 元素。注意該範圍是不推薦使用的(你應該一直儘可能去從公共或定製的 Maven 倉庫中引用依賴)。