(二)Maven之座標和依賴

目錄java

image.png

目錄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: 定義了Maven項目隸屬的實際項目

groupId命名誤區:ide

  • Maven項目不必定和實際項目一一對應。實際項目可能被劃分爲多個Maven項目
  • 不該該定義到項目隸屬的組織或公司級別,由於組織或公司可能有多個項目。
  • 與java包名命名方式類似,一般以域名反向對應。
artifactId: 定義了下實際項目的一個Maven項目
  • 建議使用實際項目名做爲artifactId的前綴。
  • 通常來講,項目中Java類的包都應該基於項目的groupId和artifactId.
version: 定義了Maven項目當前所處的版本。
packaging: 定義了Maven項目的打包方式。

打包方式一般與所生成構件擴展名對應,可是不是絕對的,並且打包方式會影響構建的生命週期。測試

classifier: 定義了構建輸出的一些附屬構件。如:在包中生成的文檔或源代碼。

依賴

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>

每一個依賴包含的元素有:優化

  • groupId,artifactId,version: 依賴的基本座標
  • type: 依賴的類型,對應定義座標時的packaging,默認值爲jar.
  • scope: 依賴的範圍
  • optional: 當前依賴是否可選
  • exclusions: 用來排除傳遞性依賴
依賴範圍【scope】

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)將會被項目引用。

最佳實踐
  • 排除依賴: 使用exclusion標籤訂義。
  • 歸類依賴: 運用Maven屬性,使用properties元素定義Maven屬性,並引用便可。
  • 優化依賴:

    mvn dependency:list (以列表方式展現項目依賴列表,包含傳遞性依賴) mvn dependency:tree (以樹形結構展現項目依賴列表)

相關文章
相關標籤/搜索