1. 程式人生 > >Maven的repository介紹和 mirror設定

Maven的repository介紹和 mirror設定

Maven的repository介紹 和 mirror設定

本文以 Maven的Mirror和Repository 的詳細講解以模板進行編寫 主要是對原文進行小量補充,但想到到CSDN積分,掛了原創的牌子,原創見諒~

18.11.9 松江圖書館

1 Repository(倉庫)

在這裡插入圖片描述

1.1 Maven倉庫主要有2種:

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

local repository:存放在本地磁碟的一個資料夾,例如,windows上預設是C:\Users\{使用者名稱}.m2\repository目錄

1.2 Remote Repository主要有3種:

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

其他公共倉庫:其他可以網際網路公共訪問maven repository,例如 jboss repository等,

repository裡存放的都是各種jar包和maven外掛。當向倉庫請求外掛或依賴的時候,會先檢查local

repository,如果local repository有則直接返回,否則會向remote repository請求,並快取到local repository。也可以把做的東西放到本地倉庫,僅供本地使用;或上傳到遠端倉庫,供大家使用。

1.3定義遠端倉庫

maven預設是從center庫中進行依賴資源,地址為http://central.maven.org/maven2/,且並非是在settings.xml中設定的(推斷是它讀取的一些其它預設配置檔案)。

但同時,我們也可以在本工程的pom.xml中,設定我們自己的遠端倉庫,且設定的新倉庫和center倉庫是並存的,並不會覆蓋。

注意在專案的pom.xml設定,非maven根目錄下的setting.xml

< project >  
...  
   < repositories >  
 < repository >  
   < id >maven-net-cn</ id >  
   < name >Maven China Mirror</ name >  
   < url >http://maven.net.cn/content/groups/public/</ url >  
   < releases >  
 < enabled >true</ enabled >  
   </ releases >  
   < snapshots >  
 < enabled >false</ enabled >  
   </ snapshots >  
 </ repository >  
   </ repositories >  
   < pluginRepositories >  
 < pluginRepository >  
   < id >maven-net-cn</ id >  
   < name >Maven China Mirror</ name >  
   < url >http://maven.net.cn/content/groups/public/</ url >  
   < releases >  
 < enabled >true</ enabled >  
   </ releases >  
   < snapshots >  
 < enabled >false</ enabled >  
   </ snapshots >  
 </ pluginRepository >  
   </ pluginRepositories >  
...  
</ project >  

這個設定,設定了本程在進行依賴資源時,會做些在center庫的中國庫中進行查詢,如果沒找到,才會去center庫中查詢;(有點像設定center庫的中國映象,後面會講)

同時,這裡也可以設定私服倉庫的url;

講到這裡,我們應當有概念: maven預設center庫,同時,我們也可以在本工程中,在pom中設定不同的庫

1.4設定本地倉庫 地址

在 settings.xml中,配置

<localRepository>/path (如:E:\.m2\repository)</localRepository>

當然,藉助IDE開發maven時,一定要把settings.xml表設定為IDE預設解析的表,表中的設定才能生效。

有一個小梗:

之前我一直有一個疑惑,maven可以幫我們管理jar包,通過denpendices標籤引入依賴,但在初次構建一個maven專案時,我還沒有引入任何依賴,卻看到IDE要下載很多jar包下來放在了本地的.m2倉庫中 ,why?

後來,大概困惑了幾天,才明白,那是因為構建一個maven專案,它本身所提供的服務,也是基於一些jar包和一些配置檔案,而它的這些jar包,也放在maven庫中,所以構建它,會自動引入。

所以,當使用IDE構建一個maven專案的時,沒有可引用的本地.m2,或者.m2倉庫中沒有maven構建需要的一些基礎依賴資源,那們,此時構建專案就會花點時間,會下載大概100M多的初始依賴。

2 Mirror

mirror 首先理解它,翻譯過來就是“映象”,而對應的應該意思就是“備份”;而在mvaen中,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></mirrorOf>標籤裡面放置的是要被映象的Repository ID。為了滿足一些複雜的需求,Maven還支援更高階的映象配置:

* 匹配所有遠端倉庫。

repo1,repo2 匹配倉庫repo1和repo2,使用逗號分隔多個遠端倉庫。

*,!repo1 匹配所有遠端倉庫,repo1除外,使用感嘆號將倉庫從匹配中排除。

3 Repository與Mirror

3.1 定義

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

3.2 配置mirror的目的

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

example 1:

在這裡插入圖片描述

maven預設center庫為http://central.maven.org/maven2/,而這個庫類目雖然龐大,但因為遠在海外,同時超高的訪問量,所以如果使用它作為作為遠端庫,依賴jar包,效率並不高

而http://maven.net.cn/content/groups/public/ 是center庫的中國映象,由於地理位置的因素,該映象往往能夠提供比中央倉庫更快的務。因此,可以配置Maven使用該映象來替代中央倉庫。編輯settings.xml,程式碼如下

settings>
  ...
  <mirrors>
<mirror>
  <id>maven.net.cn</id>
  <name>one of the central mirrors in china</name>
  <url>http://maven.net.cn/content/groups/public/</url>
  <mirrorOf>central</mirrorOf>
</mirror>
  </mirrors>
  ...
</settings>  

同時,現在也推薦用aliyun的映象

 <mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
 </mirror>  

從使用者出發的話,我們希望能從aliyun處迅速拿到依賴資源,但作為aliyun雲,它能作為center庫的映象,應當有和center庫資源同步的機制,同時類目的結構應當相同的。

example 2:

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

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

這裡會涉及幾個點:

  1. 在同一個pom.xml中,要配置倆個遠端庫 ,分別為 A 和 B
  2. 那麼,預設應該會有A和B庫的優先順序設定問題,同時應該要考慮A、B和center庫的同步機制(思路:預設公司訪問A庫–>訪問B–>預設center庫,預設期初A庫和B庫為空,每次資源可能從center庫拿,拿到後,是否會同時copy到A庫和B庫,如時同時要copy到A庫和B庫,效率要低,但如果只是copy到A庫,在住所編碼時,設定了B為A的映象,預設從B拿,但B沒有,還要請求A,所以第一次效率也並不高)
  3. 另外,不同庫要進行使用者校驗,本人暫未涉及

3.3 注意

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

4 私服

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

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

優點主要有:

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

更多文章參考:

在這裡插入圖片描述