天天看點

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學習筆記(四)——倉庫倉庫定義倉庫布局倉庫分類快照版本從倉庫解析依賴的機制鏡像

本地倉庫

一般來說,在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學習筆記(四)——倉庫倉庫定義倉庫布局倉庫分類快照版本從倉庫解析依賴的機制鏡像

私服優勢:

  • 節省自己的外網帶寬
  • 加速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獲得的構件,都能從它的鏡像中擷取。比如用中國的鏡像可以比國外的提供更快更穩定的服務。