Maven學習筆記四(坐標和依賴)
什麽是坐標? 在平面幾何中坐標(x,y)可以標識平面中唯一的一點
Maven 坐標主要組成
groupId:定義當前 Maven 項目隸屬項目、組織
artifactId:定義實際項目中的一個模塊
version:定義當前項目的當前版本
packaging:定義該項目的打包方式(pom/jar/war,默認為 jar)
groupId、artifactId、version 簡稱為 GAV。
Maven 為什麽使用坐標?
Maven 世界擁有大量構件,需要找一個用來唯一標識一個構建的統一規範 擁有了統一規範,就可以把查找工作交給機器
如何獲取坐標 http://mvnrepository.com/ 網站上可以搜索具體的組織或項目關鍵字,之後復制 對應的坐標到 pom.xml 中。如:
依賴
依賴範圍 scope 用來控制依賴和編譯,測試,運行的 classpath 的關系。具 體的依賴範圍有如下 6 種:
1) compile: 編譯域,這個是 Maven 中 scope 的默認值,我們平時不寫 scpoe 配置時默認就是使用這個值。compile 表示被依賴項目需要同當前項目編譯 時一起進行編譯,項目測試期以及本項目運行時期同樣生效,打包的時候需 要包含進去。
2) test:測試域,表示被依賴的項目僅在項目進行測試的時候生效,一般將日 誌等依賴包(如:Junit)配置為 test,項目運行時不會生效。
3) provided:provided 意味著打包的時候可以不用打包進去,別的容器會提供, 如 Servlet-API,Tomcat 這些容器會提供,所以打包,運行時無需提供。
4) runtime:運行域,表示被依賴項目不會參與項目的編譯,但項目的測試期和 運行時期會參與。與 compile 相比,跳過了編譯這個環節。(如:JDBC 驅動)
5) system:系統範圍,自定義構件,指定 systemPath;跟 provided 相似,但是 在系統中要以外部 JAR 包的形式提供,maven 不會在 repository 查找它。
6) import:只使用在中,表示從其它的 pom 中導入 dependency 的配置。
添加依賴
依賴的傳遞
A(maven_web1)項目,B(maven_web2)項目 ,C(maven_test2)項目
首先A項目中添加依賴包,保存後項目中會自動導入包
然後A項目的包傳遞到B項目中,在B項目中依賴:
c項目中依賴B項目的包(因為B也依賴了A項目的包,因此C會依賴A,B項目的包):
說明:
可選依賴
在依賴節點 dependency 中的可以控制當前的依賴是否向下傳遞; 默認值為 false,表示向下傳遞。
設置log4j<optional>true</optional>
B項目中log4j包已經沒有中A中傳遞過來
排除依賴
在 pom 中的依賴節點中,如果引入的依賴包含了很多其它的傳遞依賴,而且 項目需要的這些依賴的版本和傳遞依賴的不相符;那麽可以在依賴節點中設置排 除依賴節點
B項目進行排除依賴,C項目也不接收A中傳遞給B的依賴
依賴沖突
1.不同依賴路徑的情況
如果依賴的路徑不相同的時候,以最短的路徑為準
比如項目A中咯log4j版本為1.2.14,我們在B中引入1.2.16,那麽項目C就會變成1.2.16,就近原則。
2.相同依賴路徑的情況
1)如果直接依賴中包含有同一個坐標不同版本的資源依賴,以配置順序下方的 版本為準
2)如果間接依賴中包含有同一個坐標不同版本的資源依賴,以配置順序上方的 版本為準
首先我們就導入spring-beans這個資源
然後2個資源依賴一起引用,spring-core版本變成了4.1.6
Maven學習筆記四(坐標和依賴)