Maven 依賴範圍
1.什麼是依賴範圍?
maven 專案不同的階段引入到classpath中的依賴是不同的,例如,編譯時,maven 會將與編譯相關的依賴引入classpath中,測試時,maven會將測試相關的的依賴引入到classpath中,執行時,maven會將與執行相關的依賴引入classpath中,而依賴範圍就是用來控制依賴於這三種classpath的關係。
2.依賴範圍在pom.xml中如何體現?
pom檔案如下配置:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
其scope標籤就是依賴範圍的配置,預設是compile,可選配置有test、provided、runtime、system、import
2.有哪些依賴範圍?
既<scope>標籤的可選配置:compile、test、provided、runtime、system、import,下面一一介紹
1)編譯依賴範圍(compile),該範圍就是預設依賴範圍,此依賴範圍對 於編譯、測試、執行三種classpath都有效,舉個簡單的例子,假如專案中有spring-core的依賴,那麼spring-core不管是在編譯,測試,還是執行都會被用到,因此spring-core必須是編譯範圍(構件預設的是編譯範圍,所以依賴範圍是編譯範圍的無須顯示指定)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.5</version>
<scope>compile</scope> <!--預設為該依賴範圍,無須顯示指定--〉
</dependency>
2)測試依賴範圍(test),顧名思義就是針對於測試的,使用此依賴範圍的依賴,只對測試classpath有效,在編譯主程式碼和專案執行時,都將無法使用該依賴,最典型的例子就是 Junit, 構件在測試時才需要,所以它的依賴範圍是測試,因此它的依賴範圍需要顯示指定為<scope>test</scope> ,當然不顯示指定依賴範圍也不會報錯,但是該依賴會被加入到編譯和執行的classpath中,造成不必要的浪費 。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
3)已提供依賴範圍(provided),使用該依賴範圍的maven依賴,只對編譯和測試的classpath有效,對執行的classpath無效,典型的例子就是servlet-api, 編譯和測試該專案的時候需要該依賴,但是在執行時,web容器已經提供的該依賴,所以執行時就不再需要此依賴,如果不顯示指定該依賴範圍,並且容器依賴的版本和maven依賴的版本不一致的話,可能會引起版本衝突,造成不良影響。
<dependency>
<groupId>javax-servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
4)執行時依賴範圍(runtime),使用該依賴範圍的maven依賴,只對測試和執行的classpath有效,對編譯的classpath無效,典型例子就是JDBC的驅動實現,專案主程式碼編譯的時候只需要JDK提供的JDBC介面,只有在測試和執行的時候才需要實現上述介面的具體JDBC驅動。
5),系統依賴範圍(system),該依賴與classpath的關係與 provided依賴範圍完全一致,但是系統依賴範圍必須通過配置systemPath元素來顯示指定依賴檔案的路徑,此類依賴不是由maven倉庫解析的,而且往往與本機系統繫結,可能造成構件的不可移植,因此謹慎使用,systemPath元素可以引用環境變數:
<dependency>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stext</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
6)匯入依賴範圍(import),該依賴範圍不會對三種classpath產生影響,該依賴範圍只能與dependencyManagement元素配合使用,其功能為將目標pom檔案中dependencyManagement的配置匯入合併到當前pom的dependencyManagement中。有關dependencyManagement的功能請了解maven繼承特性。