【Maven】Maven之scope依賴范圍


一、理解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倉庫之外的類庫文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM