Maven學習3: 倉庫

1. 引入

  • maven座標和依賴是一個構件在maven世界中的邏輯表示方式,而構件的物理表示方式是文件。
  • maven經過倉庫來統一管理這些構件。
  • maven項目將再也不各自存儲其依賴文件,只須要聲明依賴座標。
  • maven採用引用的方式將依賴的jar引入進來,不對真實的jar進行拷貝,可是打包的時候,運行須要用到的jar都會被拷貝到安裝包

2. 倉庫分類

  • 本地倉庫
  • 遠程倉庫: 中央倉庫、私服、其餘公共倉庫

2.1 本地倉庫

  • 在安裝maven後本地倉庫並不存在,當咱們執行第一條maven命令的時候纔會建立本地倉庫。
  • 默認狀況下,maven本地倉庫默認地址是~/.m2/respository目錄,
  • 用戶能夠自定義本地倉庫目錄,在~/.m2/settings.xml文件中進行修改:web

    <localRepository>/Users/john/dev/repository</localRepository>
  • 下載構件:從遠程倉庫下載到本地倉庫目錄中
  • 使用本地項目構件:將本地項目構件安裝到maven本地倉庫spring

    john:demo1 john$ mvn clean install

2.2 遠程倉庫

  • 本地倉庫不存在構件時,須要從遠程倉庫下載構件。

2.3 中央倉庫

  • 在maven的超級pom中能夠看到默認的中央倉庫。apache

    • 超級pom:全部maven項目都會繼承,其中的配置會自動繼承。
    • 超級pom所在文件:${M2_HOME}/lib/maven-model-builder-3.6.3.jar
    • 解壓jar文件
    • 查看lib/org/apache/maven/model/pom-4.0.0.xml
    • 找到中央倉庫的默認配置:maven

      <repositories>
          <repository>
            <id>central</id>
            <name>Central Repository</name>
            <url>https://repo.maven.apache.org/maven2</url>
            <layout>default</layout>
            <snapshots>
              <!-- 不從該中央倉庫下載快照版本的構件 -->
              <enabled>false</enabled>
            </snapshots>
          </repository>
        </repositories>
  • 默認的中央倉庫:佈局

2.4 私服

  • 私服是一種特殊的遠程倉庫,是架設在局域網內的倉庫服務。
  • 私服代理廣域網上的遠程倉庫,供局域網內的maven用戶使用。
  • 私服的好處:測試

    • 節省本身的外網帶寬。
    • 加速maven構建。
    • 部署第三方構件。
    • 提升穩定性,加強控制。
    • 下降中央倉庫的負荷。

2.5 其餘遠程倉庫

3. 遠程倉庫配置

3.1 在項目POM中配置遠程倉庫(項目)

  1. 說明:該配置只對當前項目有效。
  2. 配置信息ui

    <project>
    ...
        <repositories>
            <repository>
                <id>aliyun-repo</id>
                <name>aliyun repo</name>
                <url>https://maven.aliyun.com/repository/public</url>
                <releases>
                    <enabled>true</enabled>
                    <!-- updatePolicy 默認值daily -->
                    <updatePolicy>daily</updatePolicy>
                    <checksumPolicy>ignore</checksumPolicy>
                </releases>
                <snapshots>
                    <!-- 不下載快照版本構件 --> 
                    <enabled>false</enabled>
                </snapshots>
                <layout>default</layout>
            </repository>
        </repositories>
    ...
    </project>
  3. repositories->repository元素說明url

    • repositories元素下可使用repository子元素聲明一個或多個遠程倉庫。
    • id:遠程倉庫標識,id名稱惟一。注意:maven自帶的中央倉庫id爲central,若是其餘的倉庫聲明也使用該id,會覆蓋中央倉庫的配置。
    • url:遠程倉庫地址。
    • releases:用來控制對於發佈版本構件的下載。代理

      • enabled屬性表示是否開啓發布版本的下載支持。
      • updatePolicy:用來配置maven從遠程倉庫更新的頻率。code

        • 默認爲daily,表示天天檢查一次。
        • never,從不檢查更新。
        • always,每次構建都檢查更新。
        • interval: X,每隔X分鐘檢查更新一次(X爲任意整數)
      • checksumPolicy:用來配置maven檢查校驗和文件的策略。

        • 默認爲warn,執行構建時給出警告信息。
        • fail,遇到校驗和錯誤,就讓構建失敗。
        • ignore,讓maven徹底忽略校驗和錯誤。
    • snapshots:用來控制對於快照版本構件的下載。

      • enabled屬性表示是否開啓快照版本的下載支持。
      • 快照版本的構件以-SNAPSHOT結尾,發佈版本沒有這個標識。
    • layoutdefault表示倉庫的佈局是maven2或者maven3的默認佈局,而不是maven1的佈局。
  4. 測試遠程倉庫可否正常拉取依賴

    • 以項目demo1爲例。
    • 首先,刪除${localRepository}/org/springframework/spring-web目錄文件,此時本地倉庫無依賴。
    • 切換到項目目錄/Users/john/Desktop/demo1,在終端執行mvn compile
    • 查看終端輸出。

      john:demo1 john$ mvn compile
      [INFO] Scanning for projects...
      [INFO] 
      [INFO] ---------------------------< com.john:demo1 >---------------------------
      [INFO] Building demo1 1.0-SNAPSHOT
      [INFO] --------------------------------[ jar ]---------------------------------
      Downloading from aliyun-repo: https://maven.aliyun.com/repository/public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.pom
      Downloaded from aliyun-repo: https://maven.aliyun.com/repository/public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.pom (1.9 kB at 5.0 kB/s)
      Downloading from aliyun-repo: https://maven.aliyun.com/repository/public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.jar
      Downloaded from aliyun-repo: https://maven.aliyun.com/repository/public/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.jar (1.4 MB at 6.3 MB/s)
      [INFO] 
      [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ demo1 ---
      [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
      [INFO] skip non existing resourceDirectory /Users/john/Desktop/demo1/demo1/src/main/resources
      [INFO] 
      [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ demo1 ---
      [INFO] Nothing to compile - all classes are up to date
      [INFO] ------------------------------------------------------------------------
      [INFO] BUILD SUCCESS
      [INFO] ------------------------------------------------------------------------
      [INFO] Total time: 1.565 s
      [INFO] Finished at: 2019-12-15T13:38:51+08:00
      [INFO] ------------------------------------------------------------------------
    • 觀察Downloading from aliyun-repo後面就是在pom文件中配置的遠程倉庫,aliyun-repo是定義的倉庫id。 在本地倉庫缺乏依賴後,就會從配置的遠程倉庫下載依賴。

3.2 在用戶配置中配置鏡像倉庫(全局)

  1. 說明:該配置對全部使用該配置的項目都有效。
  2. 什麼是鏡像倉庫?

    • 若是倉庫X能夠提供倉庫Y全部的內容,那麼就能夠認爲X是Y的一個鏡像。
    • 任何一個能夠從Y獲取的構件,均可以從它的鏡像中獲取。
    • 能夠採用鏡像的方式配置遠程倉庫,鏡像在settings.xml中進行配置,對全部使用該配置的maven項目起效。
  3. 配置鏡像倉庫

    <mirrors>
        <mirror>
          <id>aliyun-maven</id>
          <name>aliyun maven</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <mirrorOf>central</mirrorOf>        
        </mirror>
    </mirrors>
  4. 配置解釋

    • mirrors元素下包含多個mirror子元素,每一個mirror元素表示一個遠程鏡像。
    • id:鏡像id,惟一標識。
    • name:鏡像名稱。
    • url:鏡像地址
    • mirrorOf:指定哪些遠程倉庫的id使用這個鏡像去下載構件,這個對應pom.xml文件中repository元素的id。就是表示這個鏡像是給哪些pom.xml文件中的遠程倉庫使用的,這裏面須要列出遠程倉庫的id,多個之間用逗號隔開。
    • mirrorOf配置語法:

      • <mirrorOf> * </mirrorOf>:匹配全部遠程倉庫。
      • <mirrorOf>external: * </mirrorOf>:匹配全部不在本機上的遠程倉庫。
      • <mirrorOf> repo1, repo2 </mirrorOf>:匹配倉庫repo1和repo2,多個倉庫之間使用逗號分割。
      • <mirrorOf> *, !repo1 </mirrorOf>:匹配全部遠程倉庫,除了倉庫repo1,使用感嘆號(!)將倉庫從匹配中排除。
  5. 注意
    鏡像倉庫徹底屏蔽了被鏡像倉庫,當鏡像倉庫不穩定或者中止服務的時候,maven沒法自動切換到被鏡像倉庫,所以將會沒法下載構件。
  6. 結合私服使用
    因爲私服能夠代理全部遠程倉庫(包含中央倉庫),所以對於組織內部的maven用戶來講,使用一個私服地址就等於使用了全部須要的外部倉庫。

4. 倉庫佈局

  1. 倉庫佈局方式
    任何一個構件都有其惟一的座標,根據座標能夠定義其在倉庫中的惟一路徑。
  2. 舉例

    • 以spring-web的依賴爲例
    • 項目demo1 pom文件的依賴

      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-web</artifactId>
          <version>5.2.1.RELEASE</version>
      </dependency>
    • 查看spring-web的jar包在本地倉庫中的位置。

      • /Users/john/dev/repository/org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.jar
      • /Users/john/dev/repository是本地倉庫目錄。
      • 構件的目錄路徑爲groupId/artifactId/version/
      • 構件名稱爲:artifactId-version[-classifier].packaging, packaging默認爲jar。
  3. maven如何定位構件路徑

    1. 將groupId中的句點分隔符(.)轉換成路徑分隔符(/),同時在後面追加一個路徑分隔符(/)。

      • org.springframework--->org/springframework/
    2. 將artifactId拼接在1的路徑上, 同時在後面追加一個路徑分隔符(/)。

      • org/springframework/spring-web/
    3. 將version拼接在2的路徑上,同時在後面追加一個路徑分隔符(/)。

      • org/springframework/spring-web/5.2.1.RELEASE/
    4. 將構件名稱拼接在3的路徑上。

      • org/springframework/spring-web/5.2.1.RELEASE/spring-web-5.2.1.RELEASE.jar

5. 倉庫如何解析依賴

  1. 當本地倉庫沒有依賴構件的時候,maven會自動從遠程倉庫下載;
  2. 當依賴版本爲快照版本的時候,maven會自動找到最新的快照。
  3. 依賴解析機制:

    • 依賴範圍是system的時候,maven直接從本地文件系統解析構件。
    • 根據依賴座標計算倉庫路徑後,嘗試直接從本地倉庫尋找構件,如發現相應構件,則解析成功。
    • 若是本地倉庫構件不存在,而且依賴的版本是顯示的發佈版本構件,則遍歷全部的遠程倉庫,發現後 下載並解析使用。

6. 倉庫檢索

  1. Sonatype(中央倉庫):https://search.maven.org/
  2. Sonatype Nexus: https://repository.sonatype.org/
  3. MVNRepository:https://mvnrepository.com/
相關文章
相關標籤/搜索