舉例如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
scope的值有以下幾種可能,進行分情況講解:
compile
默認就是compile,什么都不配置也就是意味着compile。compile表示被依賴項目需要參與當前項目的編譯,當然后續的測試,運行周期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去。默認的scope,在部署的時候將會打包到lib目錄下,項目在編譯,測試,運行階段都需要
test
scope為test表示依賴項目僅僅參與測試相關的工作,在編譯和運行環境下都不會被使用,更別說打包了。
runntime
runntime這個scope,僅僅適用於運行環境,在編譯和測試環境下都不會被使用
provided
provided適合在編譯和測試的環境,他和compile很接近,但是provide僅僅需要在編譯和測試階段,同樣provide將不會被打包到lib目錄下。
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>是什么意思,怎么用的呢?
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
例如上面的例子,在SpringBoot官網文件中你可以得到解釋就是,<optional>true</optional>的話,其他項目依賴此項目也不會進行傳遞,只能本項目使用。