1、理解Maven scope依賴範圍的做用java
Maven在編譯項目主代碼的時候須要使用一套classspath。總共有三種classpath,分別對應於Maven編譯項目主代碼的時候、Maven編譯和執行測試的時候、實際運行Maven項目的時候。spring
- Compile: 編澤依賴範圍.若是沒有指定,就會默認使用該依賴範圍。使用此依賴範圍的Maven依賴,對於編譯、測試、運行三種classpath都有效。好比spring-core依賴,在編輯、測試、運行的時候都須要使用該依賴。
- test: 測試依賴範圍。使用此依賴範圍的Maven依賴,只對測試的classpath有效,在編譯主代碼或者運行項目時沒法使用此類依賴。好比JUnit的依賴,它只有在編譯測試代碼及運行測試的時候須要
- provided:以提供依賴範圍。使用此依賴範圍的Maven依賴,對於編譯和測試的classpath有效,但在運行時無效。好比servlet-api,編譯和測試項目的時候須要用到該依賴,但在運行項目的時候,因爲容器已經提供,就不須要Maven重複的引入一遍。
- runtime:運行時依賴範圍。使用此依賴範圍的Maven依賴,對於測試和運行classpath有效,但在編譯主代碼時無效。好比JDBC驅動的實現,項目主代碼編譯的時候,只須要JDK提供的JDBC接口就能夠,可是在執行測試或者運行項目的時候才須要實現實現JDBC接口的具體JDBC驅動。
- import:scope=import,type=pom表示在此pom中引入spring-boot-dependencies的pom的全部內容,注意只能在dependencyManagement中使用。
- system:系統依賴範圍。該依賴與三種classpath的關係,和provided依賴範圍徹底一致。只是,使用system範圍依賴時,須要指定systemPath元素顯示地指定依賴文件的路徑。因爲此依賴不是Maven倉庫解析的,並且每每與本機系統綁定,可能形成構建的不可遺址,所以不建議使用。systemPath元素能夠引用環境變量,如:
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
2、依賴範圍與classpath的關係sql
依賴範圍(scope) |
對於編譯classpath有效 |
對於測試classpath有效 |
對於運行時classpath有效 |
例子 |
compile |
Y |
Y |
Y |
spring-core |
test |
- |
Y |
- |
JUnit |
provided |
Y |
Y |
- |
servlet-api |
runtime |
- |
Y |
Y |
JDBC驅動實現 |
system |
Y |
Y |
- |
本地的,Maven倉庫以外的類庫文件 |