問題介紹:
在maven項目中,最關鍵的就是pom.xml這個文件,這個文件是用來導入maven項目依賴的jar包以及一些插件等。
在這個文件中導入jar包使用的標簽是<dependency>,而在這個標簽下有一個子標簽,叫做<scope>,它是有什么用處呢?下面我就來講講它的作用。
內容講解:
<scope>這個標簽的主要作用有三個:
1、確定導入的jar包的有效區域。這里說的區域分別為:
a)主程序區域:
b)測試程序區域:
2、是否參與maven項目的打包:
項目要部署到服務器上,是需要先將項目打包的。然而,並不是你導入項目的所有Jar包都需要一同被打包,比如junit這個專門用來編寫測試的包及其依賴,就沒有必要一起打包進項目中。使用scope的不同取值就能告訴maven哪些jar包需要被一同打包,哪些不用。
<scope>標簽的取值(只介紹主要的三種):
1、compile(默認)
導入的jar對主程序是否有效:有效
導入的jar對測試程序是否有效:有效
是否參與項目的打包:參與
例如:在maven項目中使用了sping等第三方的jar包,則需要一同打包再部署到服務器。
2、test
導入的jar對主程序是否有效:無效
導入的jar對測試程序是否有效:有效
是否參與項目的打包:參與
例如:junit包,只在開發中測試使用,並不需要打包到服務器。
注:在eclipse中,若<scope>的取值若為test,則在右側目錄中,包會顯示為灰色。如下圖:
3、provided
導入的jar對主程序是否有效:有效
導入的jar對測試程序是否有效:有效
是否參與項目打包:不參與
例如:servlet-api,tomcat服務器自帶,會自動添加到你部署的項目中,你開發項目時要用嗎,但是不需
要一起打包。
注意:
<scope>中的值不能隨便亂寫,需要合理的選擇,否則程序可能會出現錯誤。比如說,如果在導入一些Tomcat服務器自帶的依賴(如:servlet-api)時使用了compile這個取值,項目運行時就會產生錯誤,因為Tomcat自帶這些依賴,而你還將自己額外加入的相同的依賴部署到Tomcat下,兩者就會差生沖突。而若是你在導入一些Tomcat沒有但程序運行時需要的依賴時,使用了test或者provided,也會出錯,因為這些依賴將不會一起被打包部署到Tomcat下,運行時就將找不到這些依賴。
scope對依賴傳遞的影響
什么是依賴傳遞?
就是假設你有一個maven項目叫A,你在這個項目中添加了一個依賴,這個依賴是你的另一個maven項目B,你在這個被依賴的項目B中添加一些依賴,這些依賴也會自動地添加到A中,這就是依賴傳遞。簡單來說就是你的依賴的依賴也會成為你的依賴。
<scope>標簽的取值對依賴傳遞有什么影響呢?
這個影響就是,只有當依賴的scope標簽被定義為compile時才會發生依賴傳遞,而定義為test或者provided都不會發生依賴傳遞。