依賴管理是maven提供的主要功能之一。無論我們需要什麼依賴,我們只需將它們添加到POM.xml中。由於maven,所有必要的類和資源都會自動添加到項目的classpath中。

一、dependency依賴
在POM 4中,<dependency>中還引入了<scope>,它主要管理依賴的部署。目前<scope>可以使用5個值:
* compile,缺省值,適用於所有階段,會隨着項目一起發布。
* provided,類似compile,期望JDK、容器或使用者會提供這個依賴。如servlet.jar。
* runtime,只在運行時使用,如JDBC驅動,適用運行和測試階段。
* test,只在測試時使用,用於編譯和運行測試代碼。不會隨項目發布。
* system,類似provided,需要顯式提供包含依賴的jar,Maven不會在Repository中查找它。
下面看一個示例:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
二、scope參數取值項
scope的值有以下幾種可能,進行分情況講解。

(1)compile
默認就是compile,什麼都不配置也就是意味着compile。compile表示被依賴項目需要參與當前項目的編譯,當然後續的測試,運行周期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去。默認的scope在部署的時候將會打包到lib目錄下,項目在編譯,測試,運行階段都需要。

(2)test
scope為test表示依賴項目僅僅參與測試相關的工作,在編譯和運行環境下都不會被使用,更別說打包了。
(3)runntime
僅僅適用於運行環境,在編譯和測試環境下都不會被使用。
(4)provided
適合在編譯和測試的環境,和compile很接近,但是provided僅僅需要在編譯和測試階段,同樣provide將不會被打包到lib目錄下。
(5)system
從參與度來說,也與provided相同,不過被依賴項不會從maven倉庫抓,而是從本地文件系統拿,一定需要配合systemPath屬性使用。
三、scope的依賴傳遞
A–>B–>C。當前項目為A,A依賴於B,B依賴於C。知道B在A項目中的scope,那麼怎麼知道C在A中的scope呢?答案是:
當C是test或者provided時,C直接被丟棄,A不依賴C;
否則A依賴C,C的scope繼承於B的scope。
為什麼需要區分這些scope?
可以用來限制dependency的範圍可以在不同的環境下打包不同的jar包,比如junit測試類的jar包不需要在編譯運行的時候,就可以設置scope為test。
四、<optional>true</optional>屬性
最後還有一個<optional>true</optional>是什麼意思,怎麼用的呢?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
在添加依賴項時,我們可以使用optional熟悉,或將scope設置為“provided”。在這兩種情況下,依賴關係都將在聲明它們的模塊的classpath中,但是使用將它們定義為依賴關係的模塊不會在其他項目中傳遞它們,即不會形成依賴傳遞。
例如上面的例子,在SpringBoot官網文件中你可以得到解釋就是,<optional>true</optional>的話,其他項目依賴此項目也不會進行傳遞,只能本項目使用。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/223234.html