關於maven依賴中的scope幾種值的作用和用法

<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>的話,其他項目依賴此項目也不會進行傳遞,只能本項目使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章