讀古今文學網 > Maven實戰 > 5.5 依賴範圍 >

5.5 依賴範圍

上一節提到,JUnit依賴的測試範圍是test,測試範圍用元素scope表示。本節將詳細解釋什麼是測試範圍,以及各種測試範圍的效果和用途。

首先需要知道,Maven在編譯項目主代碼的時候需要使用一套classpath。在上例中,編譯項目主代碼的時候需要用到spring-core,該文件以依賴的方式被引入到classpath中。其次,Maven在編譯和執行測試的時候會使用另外一套classpath。上例中的JUnit就是一個很好的例子,該文件也以依賴的方式引入到測試使用的classpath中,不同的是這裡的依賴範圍是test。最後,實際運行Maven項目的時候,又會使用一套classpath,上例中的spring-core需要在該classpath中,而JUnit則不需要。

依賴範圍就是用來控制依賴與這三種classpath(編譯classpath、測試classpath、運行classpath)的關係,Maven有以下幾種依賴範圍:

·compile:編譯依賴範圍。如果沒有指定,就會默認使用該依賴範圍。使用此依賴範圍的Maven依賴,對於編譯、測試、運行三種classpath都有效。典型的例子是spring-core,在編譯、測試和運行的時候都需要使用該依賴。

·test:測試依賴範圍。使用此依賴範圍的Maven依賴,只對於測試classpath有效,在編譯主代碼或者運行項目的使用時將無法使用此類依賴。典型的例子是JUnit,它只有在編譯測試代碼及運行測試的時候才需要。

·provided:已提供依賴範圍。使用此依賴範圍的Maven依賴,對於編譯和測試classpath有效,但在運行時無效。典型的例子是servlet-api,編譯和測試項目的時候需要該依賴,但在運行項目的時候,由於容器已經提供,就不需要Maven重複地引入一遍。

·runtime:運行時依賴範圍。使用此依賴範圍的Maven依賴,對於測試和運行classpath有效,但在編譯主代碼時無效。典型的例子是JDBC驅動實現,項目主代碼的編譯只需要JDK提供的JDBC接口,只有在執行測試或者運行項目的時候才需要實現上述接口的具體JDBC驅動。

·system:系統依賴範圍。該依賴與三種classpath的關係,和provided依賴範圍完全一致。但是,使用system範圍的依賴時必須通過systemPath元素顯式地指定依賴文件的路徑。由於此類依賴不是通過Maven倉庫解析的,而且往往與本機系統綁定,可能造成構建的不可移植,因此應該謹慎使用。systemPath元素可以引用環境變量,如:

·import(Maven 2.0.9及以上):導入依賴範圍。該依賴範圍不會對三種classpath產生實際的影響,本書將在8.3.3節介紹Maven依賴和dependencyManagement的時候詳細介紹此依賴範圍。

上述除import以外的各種依賴範圍與三種classpath的關係如表5-1所示。

表5-1 依賴範圍與classpath的關係