目錄
spring
引言: 座標是依賴管理的基礎,是構建的惟一標識。api
組成元素: 使用groupId、artifactId、version、packaging、classifier標籤便可定義一組座標
規定:groupId,artifactId,version是必須定義的,
packaging的定義是可選的,classifier是不能直接定義的,而是之後附加的插件幫助生成的。maven
<groupId> org.sonatype.nexus </groupId> <artifactId> nexus-indexer </artifactId> <version> 2.0.0 </version> <packaging> jar </packaging>
groupId命名誤區:ide
- Maven項目不必定和實際項目一一對應。實際項目可能被劃分爲多個Maven項目
- 不該該定義到項目隸屬的組織或公司級別,由於組織或公司可能有多個項目。
- 與java包名命名方式類似,一般以域名反向對應。
- 建議使用實際項目名做爲artifactId的前綴。
- 通常來講,項目中Java類的包都應該基於項目的groupId和artifactId.
打包方式一般與所生成構件擴展名對應,可是不是絕對的,並且打包方式會影響構建的生命週期。測試
eg: <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>1.1.0.Final</version> <scope>provided</version> <optional>true</optional> <exclusions> <exclusion> <groupId>XXXX</groupId> <artifactId>XXX</artifactId> </exclusion> </dependency>
每一個依賴包含的元素有:優化
Maven有三種classpath,分別供編譯時(編譯項目主代碼)、測試時(編譯和執行測試代碼)、運行時(項目實際運行時)使用。
依賴範圍: 用來控制依賴同三種classpath的關係,即:是否將依賴引入相應的classpath中。spa
依賴範圍(scope) | 編譯classpath 生效 | 測試classpath 生效 | 運行時classpath生效 | 栗子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | N | Y | N | JUit |
provided | Y | Y | Y | N |
runtime | N | Y | Y | JDBC驅動實現 |
sytem | Y | Y | N | 除本地的Maven倉庫外的jar包 |
- 依賴範圍不只能夠控制依賴和classpath的關係,還對傳遞性依賴產生影響
可選依賴不能被傳遞!!!插件
擴展: 爲何要使用可選依賴屬性(optional)呢?
eg: 項目B進入了X、Y的兩個可選依賴,通常由業務形態決定的,業務上存在互斥性,用戶不可能同時使用X、Y的功能。
理想狀況,實際上是不該該使用可選依賴的,本着「單一職責」設計原則,最好分離開來設計。設計
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | 不傳遞 | 不傳遞 | runtime |
test | test | 不傳遞 | 不傳遞 | test |
provided | provied | 不傳遞 | provied | provided |
runtime | runtime | 不傳遞 | 不傳遞 | runtime |
注: 左邊第一列是第一直接依賴,最上邊一行是第二直接依賴。
當產生重複依賴衝突時,採用如下原則解決:
第一原則: 依賴路徑最近者優先
eg: 路徑1: A -> B -> C -> X(version:1.0)
路徑2: A -> D -> X(version:2.0)
所以原則,傳遞性依賴X(version:2.0)將會被項目引用。
第二原則: 路徑長度相同,將由pom.xml總依賴聲明的順序決定。
eg: 路徑1: A -> B -> Y(version:1.0)
路徑2: A -> C -> Y(version:2.0)
若C的引入順序在B的前面,則 傳遞性依賴Y(version:2.0)將會被項目引用。
優化依賴:
mvn dependency:list (以列表方式展現項目依賴列表,包含傳遞性依賴) mvn dependency:tree (以樹形結構展現項目依賴列表)