## 1. scope 概念 maven 在引入依賴時,配置上有一個 scope 標簽,例如: ```xml com.mysql mysql-connector-j 8.1.0 runtime ``` 例子中的 `runtime` 表示**運行時**的依賴範圍,不同的 scope 對於項目在編譯,測 ...
1. scope 概念
maven 在引入依賴時,配置上有一個 scope 標簽,例如:
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.1.0</version>
<scope>runtime</scope>
</dependency>
例子中的 <scope>runtime</scope>
表示運行時的依賴範圍,不同的 scope 對於項目在編譯,測試,打包時會產生不同的效果,瞭解不同類型的 scope 可以讓開發者在引入依賴時更加準確,避免開發、測試以及最終打包發佈時出現各種奇奇怪怪的問題。
scope 是用來規定依賴與三種 classpath 的關係的,分別是:編譯 classpath,測試 classpath,運行時 classpath。
這三種 classpath 分別也對應著 maven 中主程式編譯,測試用例編譯、執行,主程式打包這幾個流程。
設置 scope 是為了使引入的依賴在該生效的 classpath 中生效,在不該生效的 classpath 中無效。這樣才能避免最終運行的程式中出現依賴衝突或者依賴缺失的情況。
2. scope 類型
依賴的 scope 的類型一共有 5 個,常用的是前 4 個,每一個 scope 的類型控制依賴會在某一個或者某幾個 classpath 中生效。
- compile: 預設值,此類型的依賴在主程式編譯,測試用例編譯、運行生效,項目打包時也會打進包里(也就是運行時 classpath)
- test: 只在測試用例編譯、執行時生效,主程式編譯及項目打包時都不會生效
- provided: 主程式編譯,測試用例編譯、執行時生效,但是程式打包時不會生效,也就是不會被打進包里,因為程式運行時的環境會提供此類型的依賴,打進包里反而可能出現依賴衝突的情況
- runtime: 主程式編譯、測試用例編譯時不會生效,測試用例執行以及程式打包時會生效
- system: 同 provided,只不過使用時必須通過
<system-Path>
元素顯式指定依賴文件路徑,一般與本機強綁定,可能造成構建的不可移植,應謹慎使用。
簡潔版的對應關係描述可以看下麵的表格。
3. scope 與 classpath 關係
依賴範圍(scope) | 編譯 classpath 有效 | 測試 classpath 有效 | 運行時 classpath 有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | N | Y | N | JUnit |
provided | Y | Y | N | servlet-api |
runtime | N | Y | Y | JDBC 驅動 |
system | Y | Y | N | 本地的,Maven 倉庫之外的類庫文件 |