scope的分類
1.compile:默認值 他表示被依賴項目須要參與當前項目的編譯,還有後續的測試,運行週期也參與其中,是一個比較強的依賴。打包的時候一般須要包含進去mysql
2.test:依賴項目僅僅參與測試相關的工做,包括測試代碼的編譯和執行,不會被打包,例如:junitsql
3.runtime:表示被依賴項目無需參與項目的編譯,不事後期的測試和運行週期須要其參與。與compile相比,跳過了編譯而已。例如JDBC驅動,適用運行和測試階段api
4.provided:打包的時候能夠不用包進去,別的設施會提供。事實上該依賴理論上能夠參與編譯,測試,運行等週期。至關於compile,可是打包階段作了exclude操做tomcat
5.system:從參與度來講,和provided相同,不過被依賴項不會從maven倉庫下載,而是從本地文件系統拿。須要添加systemPath的屬性來定義路徑maven
6.import(only available in Maven 2.0.9 or later):這個是maven2.0.9版本後出的屬性,import只能在dependencyManagement的中使用,能解決maven單繼承問題,import依賴關係實際上並不參與限制依賴關係的傳遞性。
ide
使用import scope解決maven繼承(單)問題
測試
scope的依賴傳遞
A依賴B,B依賴C。當前項目爲A,只當B在A項目中的scope,那麼c在A中的scope是如何得知呢?spa
當C是test或者provided時,C直接被丟棄,A不依賴C;(排除傳遞依賴)code
不然A依賴C,C的scope繼承與B的scope
Maven的生命週期
clean:有問題,多清理! package:打成Jar or War包,會自動進行clean+compile install:將本地工程Jar上傳到本地倉庫 deploy:上傳到私服
關於scope依賴範圍
既然,Maven的生命週期存在編譯、測試、運行這些過程,那麼顯然有些依賴只用於測試,好比junit;有些依賴編譯用不到,只有運行的時候才能用到,好比mysql的驅動包在編譯期就用不到(編譯期用的是JDBC接口),而是在運行時用到的;還有些依賴,編譯期要用到,而運行期不須要提供,由於有些容器已經提供了,好比servlet-api在tomcat中已經提供了,咱們只須要的是編譯期提供而已。
compile:默認的scope,運行期有效,須要打入包中。 provided:編譯期有效,運行期不須要提供,不會打入包中。 runtime:編譯不須要,在運行期有效,須要導入包中。(接口與實現分離) test:測試須要,不會打入包中。 system:非本地倉庫引入、存在系統的某個路徑下的jar。(通常不使用)