一、座標java
Maven座標爲各個構件創建了秩序,任何一個構件都必須明確本身的座標,一個maven座標是由一些元素肯定的mysql
<groupId>com.alivn.account</groupId> <artifactId>account-email</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging>
groupId:定義爲maven項目隸屬的實際項目,能夠至關於爲一個項目的頂級。 好比 支付系統sql
artifactId:maven項目的一個子項目 好比 支付系統下的dao模塊數據庫
version:當前項目的版本號api
packaging:定義該maven項目的打包方式 默認jar tomcat
classifier:幫助構建輸出一些附屬屬性,好比account-email.1.0.jar, 藉助插件生成account-email.1.0-doc.jar(apiw文檔)框架
二、依賴maven
每一個project根元素下,能夠包含節點<dependencies>節點。裏面包含了若干依賴ide
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> <type>jar</type> <optional>true</optional> <exclusions> <exclusion> <groupId>${dependencygroupId}</groupId> <artifactId>${dependencyartifactId}</artifactId> </exclusion> </exclusions> </dependency>
groupId、artifactId、version是一個引入一個依賴必不可少的元素。測試
scope:依賴的做用範圍 test表示 只在test的代碼裏面的生效
type:依賴的類型 對應packaging
optional:依賴是否可選。
exclusions:排除依賴,當第二依賴裏面依賴了一個不穩定的快照版本的jar時候,存在潛在危險,因此咱們應該排除第二依賴裏面的那個不穩定版本的依賴,在pom中引用爲直接依賴。
三、依賴範圍
maven在編譯 測試 和運行時會使用三個不一樣的classpath,會根據以依賴範圍處理不一樣的內容,好比主編譯時,不會加入scope爲test範圍的代碼,由於它的依賴範圍是test
有如下幾種依賴範圍
compile:編譯依賴範圍 默認值 對編譯 測試 運行 三種 classpath都有效
test:測試依賴範圍 只對測試classpath有效
provided:以提供以來範圍,僅對編譯和測試有效,運行無效,好比servlet-*jar,運行時 框架有tomcat提供jar
runtime:對測試和運行有效 但編譯無效 如JDBC驅動,只在運行的時候決定使用哪一個數據庫的驅動
system:系統依賴範圍,和provided範圍一致,但必須經過systemPath顯示指定依賴文件
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> <scope>system</scope> <systemPath>${home}/lib/mysql.rt</systemPath> </dependency>
四、傳遞性依賴
A->B ,B->C=》A->C
若是A依賴於B B依賴於C 那麼A依賴於C B爲A 的第一直接依賴 C爲B 的第二直接依賴。
根據scope的依賴範圍不一樣 能夠將C於A 的依賴範圍 也會有變化 ,具體變化爲如下表格 藍色字體爲第一直接依賴 紅色字體爲第二直接依賴
依賴範圍 | compile | test | provided | runtime |
compile | compile | —— | —— | runtime |
test | test | —— | —— | test |
provided | provided | —— | provided | provided |
runtime | runtime | —— | —— | runtime |
五、依賴調解
maven傳遞依賴爲咱們帶來了不少的方便,可是若是 A->B->C(2.0) A->D->C(1.0) 這個時候會解析 哪一個版本的C
maven有兩條規則:(當第一條規則 不生效時 使用第二條規則)
一、路徑最近者優先 實例中 都是兩步 距離是相同的 若是不一樣則去最近者
二、第一聲明者優先 程序中 看B 和C 哪一個jar裏面的類先被使用,而後解析先被使用的jar的那條線路上的c
六、查看依賴的命令
mvn dependency:list(顯示全部已解析的依賴)
mvn dependency:tree(顯示依賴樹)
mvn dependency:analyze(分析當前項目的依賴)