一、理解Maven scope依賴范圍的作用
Maven在編譯項目主代碼的時候需要使用一套classspath。總共有三種classpath,分別對應於Maven編譯項目主代碼的時候、Maven編譯和執行測試的時候、實際運行Maven項目的時候。
- 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>
二、依賴范圍與classpath的關系
依賴范圍(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倉庫之外的類庫文件 |