Maven學習筆記(四)——倉庫

倉庫定義

得益於座標機制,任何Maven項目使用任何一個構件的方式都是完全相同的。在此基礎上,Maven可以在某個位置可以統一存儲所有Maven項目共享的構件,這個統一的位置就是倉庫。實際的Maven項目將不再各自存儲其依賴文件,他們只需要聲明這些依賴的座標,在需要的時候,Maven就會自動根據座標找到倉庫中的構件,並使用它們。

倉庫佈局

任何構件都有其唯一的座標,根據這個座標可以定義其在倉庫中的唯一存儲路徑,這便是Maven的佈局方式。例如,log4j : log4j : 1.2.15這一依賴,其對應的倉庫路徑爲log4j/log4j/1.2.15/log4j-1.2.15.jar,該路徑與座標的大致對應關係爲groupId/artifactId/version/artifactId-version.packaging。

倉庫分類

對於Maven來說,倉庫只分兩類:本地倉庫和遠程倉庫。當Maven根據座標尋找構件的時候,它會首先查看本地倉庫,如果本地倉庫存在此構件,將直接使用;如果本地倉庫不存在此構件,或者需要查看是否有更新的構件版本,Maven就會去遠程倉庫查找,發現需要的構件之後,下載到本地倉庫再使用。如果本地倉庫和遠程倉庫都沒有需要的構件,Maven就會報錯。
有一些特殊的遠程倉庫,中央倉庫是Maven核心自帶的遠程倉庫,它包含了大部分開源的構件。在默認配置下,當本地倉庫沒有Maven需要的構件的時候,它就會嘗試從中央倉庫下載。
私服是另一種特殊的遠程倉庫,爲了節省帶寬和時間,應該在局域網內架設一個私有的倉庫服務器,用其代理所有的外部遠程倉庫。內部的項目還能部署到私服上供其他項目使用。
分類如圖:
在這裏插入圖片描述

本地倉庫

一般來說,在Maven項目目錄下,沒有像lib/這樣用來存放依賴文件的目錄,當Maven在執行編譯或測試時,如果需要使用依賴文件,它總是基於座標使用本地倉庫的依賴文件。
默認情況下,不管是在Windows或在Linux文件中,每個用戶在自己的用戶目錄下都有一個路徑名爲./m2/repository/的倉庫目錄。在類Linux系統中,以(.)開頭的文件或目錄默認是隱藏的,可以使用ls -a命令顯示隱藏文件或目錄。
有時候,因爲某些原因,用戶會想要自定義本地倉庫目錄地址。可以編輯文件~/.m2/settings.xml,設置localRepository元素的值爲想要的倉庫地址。
需要注意的是,默認情況下,文件~/.m2/settings.xml是不存在的,用戶需要從Maven安裝目錄複製$M2_HOME/conf/settings.xml文件再進行編輯。推薦不要直接修改全局目錄的settings.xml文件。
一個構件只有在本地倉庫中,才能被Maven項目使用,進入本地倉庫的方式有兩種,一種是依賴Maven從遠程倉庫下載到本地倉庫,另一種是將本地項目的構件安裝到Maven倉庫中。

遠程倉庫

安裝好Maven後,如果不執行任何Maven命令,本地倉庫目錄是不存在的。當用戶輸入第一條Maven命令後,Maven纔會創建本地倉庫,然後根據配置和需要,從遠程倉庫下載構件到本地倉庫。

中央倉庫

由於最原始的本地倉庫是空的,Maven必須要知道一個至少可用的遠程倉庫,才能在執行Maven命令的時候下載到需要的構件。中央倉庫就是這樣一個默認的遠程倉庫,Maven的安裝文件自帶了中央倉庫的配置。

私服

私服是一種特殊的遠程倉庫,它是假設在局域網內的倉庫服務,私服代理廣域網上的遠程倉庫,供局域網內的Maven用戶使用。當Maven需要下載構件的時候,它從私服請求,如果私服上不存在該構件,則從倉庫的遠程倉庫下載,緩存在私服上之後,再爲Maven的下載請求提供服務。此外,一些無法從外部倉庫下載到的構件也能從本地上傳到私服供人使用。如圖:
在這裏插入圖片描述
私服優勢:

  • 節省自己的外網帶寬
  • 加速Maven構建
  • 部署第三方構件
  • 提高穩定性,增強控制
  • 降低中央倉庫的負荷

快照版本

帶有SNAPSHOT就是組件的快照版本。
假設模塊B依賴於模塊A,將模塊A的版本設定爲2.1-SNAPSHOT,然後發佈到私服中,在發佈的過程中,Maven就會自動爲構件打上時間戳。比如2.1-20091214.221414-13就表示2009年12月14日22點14分14秒的第13次快照。有了該時間戳,Maven就能隨時找到倉庫中該構件2.1-SNAPSHOT版本最新的文件。在構件B模塊的時候,Maven會自動從倉庫中檢查模塊A的2.1-SNAPSHOT的最新構件,發現有更新時便下載。默認情況下,Maven每天檢查一次更新,用戶也可以使用命令行-U參數強制讓Maven檢查更新。

從倉庫解析依賴的機制

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

  1. 當依賴範圍是system時,Maven直接從本地文件系統解析構件
  2. 根據依賴座標計算倉庫路徑後,嘗試直接從本地倉庫尋找構件,如果發現相應構件,則解析成功
  3. 在本地倉庫不存在相應構件的情況下,如果依賴版本是顯示的發佈版本構件,則遍歷所有遠程倉庫,發現後下載並解析使用
  4. 如果依賴的版本是RELEASE或LATEST,則基於更新策略讀取遠程倉庫的元數據groupId/artifactId/version/maven-metadata.xml,將其與本地倉庫對應元數據合併後,計算出RELEASE或LATEST的真實值,然後基於這個真實的值檢查本地和遠程倉庫
  5. 如果依賴的版本是SNAPSHOT,則基於更新策略讀取遠程倉庫的元數據groupId/artifactId/version/maven-metadata.xml,將其與本地倉庫對應元數據合併後,得到最新的快照版本值,然後基於這個值檢查本地和遠程倉庫
  6. 如果最後解析到的構件版本是時間戳的快照,則複製器時間戳格式的文件至非時間戳格式,並使用非時間戳格式的構件

鏡像

如果倉庫X可以提供倉庫Y存儲的所有內容,那麼就可以任務X是Y的一個鏡像。也就是任何一個可以從倉庫Y獲得的構件,都能從它的鏡像中獲取。比如用中國的鏡像可以比國外的提供更快更穩定的服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章