Maven的scope详解
文章目錄
- 依賴范圍介紹
- compile
- test
- provided
- runtime
- system
- import
- 依賴傳遞
- 依賴范圍與 classpath 的關系表
- 參考
依賴范圍介紹
maven 項目不同的階段引入到classpath中的依賴是不同的,例如,編譯時,maven 會將與編譯相關的依賴引入classpath中,測試時,maven會將測試相關的的依賴引入到classpath中,運行時,maven會將與運行相關的依賴引入classpath中。依賴范圍就是用來控制依賴與三種classpath(編譯classpath、測試classpath、運行classpath)的關系。
依賴范圍必須在 pom.xml 文件中的 <scope> 標簽中設定,如下所示:
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.7</version><scope>test</scope> </dependency>上述 <scope> 標簽就是用來指定被依賴資源的依賴范圍,可選配置有 compile、test、provided、runtime、system、import,若不指定則默認 compile。
在 pom.xml 中設定好后,你需要點擊“Load Maven Changes” 才會生效。
比方說,你修改了標簽 <scope> 的取值,你需要 Load Maven Changes,在模塊的依賴管理中才會出現新的取值,如下所示:
你如果只是在上述依賴管理的界面中改變 scope 的取值是沒有效果的,只能通過 pom.xml 中的 scope 標簽來設定。
說明:
1.編譯是指將整個項目(其實是模塊)的 src/main/java 目錄下的源代碼文件以及 resources 目錄下的資源文件編譯輸出到 classes 目錄下。在這個編譯過程中編譯器會到 classpath 指定的目錄下查找字節碼文件(jar包、class文件等)
2.測試是指編譯測試的代碼和運行測試的代碼,通常使用 Junit 工具進行代碼的測試
3.運行是指項目部署到服務器,并且啟動了服務器,客戶端可以正常訪問應用
compile
編譯依賴范圍。如果沒有指定,就會默認使用該依賴范圍。使用此依賴范圍的Maven 依賴,對于編譯、測試、運行三種classpath 都有效。典型的例子是spring-core,在編譯、測試和運行的時候都需要使用該依賴。
既然運行時也要使用 scope 設為 compile 的依賴,所以 scope 為 compile 的依賴在項目打部署包的時候(即構建 artifact)會被一起打包,會放在 WEB-INF/lib 目錄下。
test
測試依賴范圍。使用此依賴范圍的Maven依賴,只對于測試classpath有效,在編譯主代碼或者運行項目的使用時將無法使用此類依賴。典型的例子是JUnit,它只有在編譯測試代碼及運行測試的時候才需要。
scope 為 test 的依賴只在測試時使用,用于編譯和運行測試代碼,不會參與項目的打包。
provided
已提供依賴范圍。使用此依賴范圍的Maven依賴,對于編譯和測試classpath有效,但在運行時無效(對運行的classpath無效)。典型的例子是 servlet-api, 編譯和測試項目的時候需要該依賴,但在運行項目的時候,由于容器已經提供,就不需要Maven重復地引人一遍。既然運行時容器會提供,所以 scope 為 provided 的依賴不會參與項目的打包。
runtime
運行時依賴范圍。使用此依賴范圍的Maven依賴,對于測試和運行class-path有效,但在編譯主代碼時無效(對編譯的classpath無效)。典型的例子是JDBC驅動實現,項目主代碼的編譯只需要JDK提供的JDBC接口,只有在執行測試或者運行項目的時候才需要實現上述接口的具體JDBC驅動。
既然運行時也要使用 scope 設為 provided 的依賴,所以 scope 為 provided 的依賴在項目打部署包的時候(即構建 artifact)會被一起打包,會放在 WEB-INF/lib 目錄下。
system
系統依賴范圍。該依賴與三種 classpath 的關系,和 provided 依賴范圍完全一致。但是,system 范圍的依賴不會從 maven 倉庫下載,而是從本地文件系統獲取,使用 system 范圍的依賴時必須通過 <systemPath> 元素顯式地指定依賴文件的路徑。
由于此類依賴不是通過 Maven 倉庫解析的,而且往往與本機系統綁定,可能造成構建(構建的產物有:classes和artifact)的不可移植,因此應該謹慎使用。
元素 <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>import
導入依賴范圍,該依賴范圍不會對三種 classpath 產生影響,該依賴范圍只能與 <dependencyManagement> 元素配合使用,其功能為將目標pom.xml 文件中元素 <dependencyManagement> 的配置導入合并到當前 pom.xml 文件的元素 <dependencyManagement> 中。有關元素 <dependencyManagement> 的功能請了解 Maven 繼承特性。
依賴傳遞
什么是依賴傳遞?
就是假設你有一個 Maven 項目叫 A,你在這個項目中添加了一個依賴,這個依賴是你的另一個 Maven 項目 B,你在這個被依賴的項目 B 中添加一些依賴,這些依賴也會自動地添加到 A 中,這就是依賴傳遞。簡單來說就是項目的依賴的依賴也會成為該項目的依賴。
<scope> 標簽的取值對依賴傳遞有什么影響呢?
這個影響就是,只有當依賴的 scope 標簽被定義為 compile 時才會發生依賴傳遞,而定義為 test 或者 provided 都不會發生依賴傳遞。
依賴范圍與 classpath 的關系表
參考
https://www.pianshen.com/article/90681857024/
https://www.liaoxuefeng.com/wiki/1252599548343744/1309301178105890
https://www.cnblogs.com/sanshisiniao/articles/12068847.html
https://www.cnblogs.com/tuyang1129/p/10741558.html
https://blog.csdn.net/seasonsbin/article/details/79093647
https://blog.csdn.net/lishuoboy/article/details/100554751
總結
以上是生活随笔為你收集整理的Maven的scope详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DDos攻击防范基本思路(ddos攻防准
- 下一篇: 异常:Caused by: java.l