在Maven的依賴管理中.java
目前有6種類型的scope他們分別是,compile,provided, test,runtime,system,importspring
在詳細介紹他們以前,首要要理解一下,maven世界中的3種classpath和2種source(resources)服務器
咱們都知道在maven的規範中,框架
要求咱們使用2個source 目錄分別存放項目源代碼和測試源代碼。maven
要求咱們使用2個resource 目錄分別存放項目源(配置)文件和測試(配置)文件。ide
|---src |---main |---java |---resources |---test |----java |----resources
固然了,不按照maven規定的默認路勁來擺放,也能夠按照你本身一套來擺放。可是不是很建議這麼作, 由於Maven默認的這2個路勁能夠適用絕大多數的項目了,除非說你作構建的程序的目錄層級結構很怪異,或者說 maven的這一套已經不適用了,那麼能夠本身定義了。可是無論你怎麼定義,在maven的世界裏面 就這2種類型的源代碼路勁,好比說我能夠這麼定義:函數
/main/ejb/ ---> 放源代碼 /main/jee/ ---> 放源代碼 /main/mobile ---> 放源代碼 /test/ejb/ ---> 放測試代碼 /test/jee ---> 放測試代碼 /test/mobile/ ---> 放測試代碼
所謂配置文件,無非就是框架和規範要求使用的一些文件,好比說 log4j,hibernate jpa spring等的配置文件。固然了,和source 相似,你也能夠不按照maven默認的路徑來擺放。可是 也不是很建議這麼作,理由同source單元測試
要注意的是,若是說你在源代碼寫了一段主函數 運行起來而且是須要加載這些配置文件的,那麼這段程序是會在源代碼目錄裏面和源配置文件目錄裏面去需找所須要的這些配置文件。除非說 你在加載這些文件的時候使用的是系統絕對路勁, 那麼你就能夠徹底忽略maven的規定了。也有一些框架 就是這麼規定說,把log4j.properties放到哪里哪里,這個時候 就循序漸進吧,該放哪放哪了。測試
這個classpath 表示的是 在編譯測試代碼的時候使用的一個classpath,在編譯測試源代碼的時候,或者說 在執行單元測試(junit)的時候或者說執行測試源代碼主函數的時候,會加載這個 test classpath,因此說,單元測試所須要加載的jar包之類的是須要放進這個classpath裏面的spa
這個classpath 表示的是 在編譯源代碼的時候使用一個classpath, 在編譯源代碼的時候或者說執行源代碼主函數的時候,會加載這個 compile classpath,因此說,源代碼所須要加載的jar包之類的是須要放進這個classpath裏面的,好比說你使用了hibernate這個框架來作數據存儲,那麼你須要把hiernate須要的一些包放到這個classpath中
package classpath 或者container classpath
這個classpath 表示的是 在打包的時候會這些classpath裏面的jar包一同放到你所打的包裏面了,好比說你打的包裏面用到了spring,並且呢你部署的那個服務器上面的類庫也沒有spring,那麼就須要把spring放到package的classpath
言歸正傳了,在maven依賴管理中,定義的scope其實就是告知maven 這個依賴是使用到哪一個classpath中。
其中 compile 是maven默認的一個scope。
其中須要注意的是provide和system雖然範圍同樣,可是 system表示的使用本地非倉庫的依賴包,須要額外定義一個systemPath的屬性,告知jar包的路勁
Test Classpath | Compile Classpath | Package Classpath | |
compile | Y | Y | Y |
provided | Y | Y | |
test | Y | ||
runtime | Y | Y | |
system | Y | Y |
這是個用於maven 繼承機制的的一個特殊的scope。