1. 程式人生 > >Maven:mirror和repository區別

Maven:mirror和repository區別

什麼是映象?

什麼是倉庫?

1.Repository(倉庫)

這裡寫圖片描述

1.1 Maven倉庫種類

有2大類倉庫:

  1. 遠端

remote repository:相當於公共的倉庫,大家都能訪問到,一般可以用URL的形式訪問。

  1. 本地

local repository:存放在本地磁碟的一個資料夾.

如我的:\Users\xiao\.m2\repository\

1.2 Remote Repository的種類

遠端倉庫有2種:

  1. 私服:內網自建的maven repository,其URL是一個內部網址。

  2. 其他公共倉庫:其他可以網際網路公共訪問maven repository。

repository裡存放的都是各種jar包和maven外掛。

當向倉庫請求外掛或依賴的時候,會先檢查local repository,如果local repository有則直接返回,否則會向remote repository請求,並快取到local repository。

也可以把做的東西放到本地倉庫,僅供本地使用;或上傳到遠端倉庫,供大家使用。

2.Mirror(映象)

mirror相當於一個攔截器,它會攔截maven對remote repository的相關請求,把請求裡的remote repository地址,重定向到mirror裡配置的地址。

2.1 沒有配置mirror:

這裡寫圖片描述

2.2 配置mirror:

這裡寫圖片描述

此時,B Repository被稱為A Repository的映象。

如果倉庫X可以提供倉庫Y儲存的所有內容,那麼就可以認為X是Y的一個映象。

換句話說,任何一個可以從倉庫Y獲得的構件,都胡夠從它的映象中獲取。

2.3 <mirrorOf>標籤

<mirrorOf></mirrorOf>標籤裡面放置的是要被映象的Repository ID。

為了滿足一些複雜的需求,Maven還支援更高階的映象配置:

配置 說明
<mirrorOf>*</mirrorOf>
匹配所有遠端倉庫。
<mirrorOf>repo1,repo2</mirrorOf> 匹配倉庫repo1和repo2,使用逗號分隔多個遠端倉庫。
<mirrorOf>*,!repo1</miiroOf> 匹配所有遠端倉庫,repo1除外,使用感嘆號將倉庫從匹配中排除。

3 Repository與Mirror

3.1 定義

其實,mirror表示的是兩個Repository之間的關係,在maven配置檔案(setting.xml)裡配置了<mirrors><mirror>..........</mirror></mirrors>,即定義了兩個Repository之間的映象關係。

3.2 目的

配置兩個Repository之間的映象關係,一般是出於訪問速度和下載速度考慮。

例如, 有一個專案,需要在公司和住所都編碼,並在專案pom.xml配置了A Maven庫。在公司,是電信網路,訪問A庫很快,所以maven管理依賴和外掛都從A庫下載;在住所,是網通網路,訪問A庫很慢,但是訪問B庫很快。這時,在住所的setting.xml裡,只要配置一下<mirrors><mirror>....</mirror></mirrors>,讓B庫成為A庫的mirror,即可不用更改專案pom.xml裡對於A庫的相關配置。

如果該映象倉庫需要認證,則配置setting.xml中的即可。

3.3 注意

需要注意的是,由於映象倉庫完全遮蔽了被映象倉庫,當映象倉庫不穩定或者停止服務的時候,Maven仍將無法訪問被映象倉庫,因而將無法下載構件。

4 私服

私服是一種特殊的遠端Maven倉庫,它是架設在區域網內的倉庫服務,私服一般被配置為網際網路遠端倉庫的映象,供區域網內的Maven使用者使用。

當Maven需要下載構件的時候,先向私服請求,如果私服上不存在該構件,則從外部的遠端倉庫下載,同時快取在私服之上,然後為Maven下載請求提供下載服務,另外,對於自定義或第三方的jar可以從本地上傳到私服,供區域網內其他maven使用者使用。

優點主要有:

  1. 節省外網寬頻
  2. 加速Maven構建
  3. 部署第三方構件
  4. 提高穩定性、增強控制:原因是外網不穩定
  5. 降低中央倉庫的負荷:原因是中央倉庫訪問量太大

這裡寫圖片描述

Maven倉庫示意圖:

這裡寫圖片描述