mirror鏡像和repository遠(yuǎn)程倉(cāng)庫(kù)、mirrorof

mirror鏡像和repository遠(yuǎn)程倉(cāng)庫(kù)

mirror就是鏡像,主要提供一個(gè)方便切換遠(yuǎn)程倉(cāng)庫(kù)地址的途徑。

比如,上班的時(shí)候在公司,用電信的網(wǎng)絡(luò),連的是電信的倉(cāng)庫(kù)。

回到家后,是聯(lián)通的網(wǎng)絡(luò),我想連聯(lián)通的倉(cāng)庫(kù),就可以通過(guò)mirror配置,統(tǒng)一把我工程里的倉(cāng)庫(kù)地址都改成聯(lián)通的,而不用到具體工程配置文件里一個(gè)一個(gè)地改地址。

《maven實(shí)戰(zhàn)》里面解釋的鏡像:

image-20200731010445498
image-20200731010542055

mirrorof的官方文檔解釋

https://maven.apache.org/guides/mini/guide-mirror-settings.html

可以理解為,mirrorof就是鏡像規(guī)則。這個(gè)規(guī)則,將鏡像mirror(setting.xml的設(shè)置)和遠(yuǎn)程倉(cāng)庫(kù)repository(pom.xml的repository設(shè)置)關(guān)聯(lián)起來(lái)。哪個(gè)遠(yuǎn)程倉(cāng)庫(kù)被哪個(gè)鏡像所替代。

如果還是沒(méi)能理解,可以看看這兩篇博客。

記錄maven配置 mirrorOf 坑

maven的setting配置文件中mirror和repository的區(qū)別

  • ==如果maven setting.xml中配置了鏡像mirror , 而鏡像mirror配置里mirrorof的規(guī)則,匹配到目標(biāo)倉(cāng)庫(kù)時(shí) ,
    maven認(rèn)為目標(biāo)倉(cāng)庫(kù)被鏡像了, 不會(huì)再去被鏡像倉(cāng)庫(kù)下載依賴jar包, 而是直接去鏡像倉(cāng)庫(kù)下載。即maven里面設(shè)置的repository會(huì)被setting.xml里面的mirror所屏蔽。==
  • <mirrorof></mirrorof>的值為匹配repository倉(cāng)庫(kù)的id。也可以使用高級(jí)配置,如通配符*,否定符!。
<mirror>
    <id>aliyun-maven</id>    
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>repotest</mirrorOf>
</mirror> 

鏡像配置的規(guī)則 <mirrorOf>repotest</mirrorOf> 匹配到目標(biāo)倉(cāng)庫(kù) <id>repotest</id>,所以maven認(rèn)為目標(biāo)倉(cāng)庫(kù)repotest被鏡像了, 不再去https://repo.maven.apache.org/maven2/地址下載jar包,而是去鏡像倉(cāng)庫(kù)http://maven.aliyun.com/nexus/content/groups/public/下載jar包。

<repositories>
    <repository>
        <id>repotest</id>
        <url>https://repo.maven.apache.org/maven2/</url>
    </repository>
</repositories> 

我們通過(guò)下面例子去理解鏡像mirror和倉(cāng)庫(kù)repository和mirrorof的含義

默認(rèn)中央倉(cāng)庫(kù)

先把setting.xml里面的mirror配置去掉,保持<mirrors></mirrors>節(jié)點(diǎn)為空,然后一步一步開始實(shí)踐,了解這三個(gè)的含義。

# 在pom.xml配置以下內(nèi)容:
<repositories>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
 </repositories>
 <dependencies>
  <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>2.6.0-dad1-cdh5.14.2</version>
        </dependency>
  </dependencies>
  • 可以從idea的解析maven依賴的順序,觀察出:先去cloudera倉(cāng)庫(kù)找這個(gè)jar包。
image-20200731161245569
  • 發(fā)現(xiàn)在cloudera倉(cāng)庫(kù)沒(méi)找這個(gè)jar包。所以去默認(rèn)中央倉(cāng)庫(kù)去找這個(gè)jar包。
image-20200731161316685

從上面這個(gè)例子,我們可以這么理解,默認(rèn)情況下,maven下面的pom.xml的中央倉(cāng)庫(kù),缺省了模板倉(cāng)庫(kù)id為central,url為maven中央倉(cāng)庫(kù)url:https://repo.maven.apache.org/maven2/。

# 默認(rèn)中央倉(cāng)庫(kù)

<repositories>
    <repository>
        <id>central</id>
        <url>https://repo.maven.apache.org/maven2/</url>
    </repository>
</repositories> 

修改默認(rèn)中央倉(cāng)庫(kù)地址

我們可以在pom.xml,設(shè)置一個(gè)id為central和url來(lái)覆蓋缺省 id = central的url。

<repositories>
    <repository>
        <id>central</id>
        <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>
</repositories>

然后下載mysql驅(qū)動(dòng),此時(shí)發(fā)現(xiàn),下載mysql驅(qū)動(dòng)失敗。因?yàn)槟J(rèn)中央倉(cāng)庫(kù)的url被重寫成cloudera公司的目標(biāo)倉(cāng)庫(kù)。但cloudera公司自己搭建的倉(cāng)庫(kù)里面并沒(méi)有這個(gè)jar包。所以pom.xml找不到這個(gè)jar包。

image-20200731004004686

倉(cāng)庫(kù)的優(yōu)先級(jí)

先從repository找出所有id的名字,看看他們有沒(méi)有被setting.xml配置的mirror的mirrorof規(guī)則所匹配(即被鏡像到),如果有,將repository的url地址改成mirror配置的url,替換完地址后。再依次檢索repositorys下面所有的repository下載相應(yīng)的jar。

例子1:

<mirrorOf>central</mirrorOf>

 <mirror>
       <id>alimaven</id>    
       <name>aliyun maven</name>
       <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
       <mirrorOf>central</mirrorOf>
  </mirror> 
    <repositories>
     <repository>
        <id>central</id>
        <url>https://repo.maven.apache.org/maven2/</url>
     </repository>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
    </repositories>
  • 鏡像url替換后會(huì)變成下面所示:
    <repositories>
     <repository>
        <id>central</id>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
     </repository>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
    </repositories>
  • 然后依次從central倉(cāng)庫(kù),尋找jar包,如果找不到則到cloudera倉(cāng)庫(kù)尋找jar。
  • 可以通過(guò)hadoop-client這個(gè)只有cloudera倉(cāng)庫(kù)有的jar,而阿里云沒(méi)有。去看看maven尋找jar包的過(guò)程。
<dependencies>
   <dependency>
   <groupId>org.apache.hadoop</groupId>
   <artifactId>hadoop-client</artifactId>
   <version>2.6.0-mr1-cdh5.14.2</version>
   </dependency>
 </dependencies>

例子2:

<mirrorOf>central</mirrorOf>加上<mirrorOf>*</mirrorOf>

   
   pom.xml的設(shè)置:
   
   <repositories>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
        <repository>
            <id>central</id>
            <url>https://arepository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
    </repositories>
    
    
     加上setting.xml的設(shè)置:
           
     <mirror>
       <id>aliyun-maven</id>    
       <name>aliyun maven</name>
       <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
       <mirrorOf>central</mirrorOf>
     </mirror> 
     <mirror>
        <id>central-Repository</id>
        <name>Maven central Repository</name>
        <url>https://repo1.maven.org/maven2/</url>
        <mirrorOf>*</mirrorOf>  
      </mirror>
      
      
 # <mirrorOf>central</mirrorOf> 匹配到遠(yuǎn)程倉(cāng)庫(kù) <id>central</id>,所以遠(yuǎn)程倉(cāng)url替換成mirror的url;
 # 因?yàn)?lt;id>central</id>已經(jīng)被mirror的url替換了,就不再鏡像了;
 # <mirrorOf>*</mirrorOf> 替換 <id>cloudera</id>的url。
 
     最終的目標(biāo)倉(cāng)庫(kù):
      
     <repositories>
        <repository>
            <id>cloudera</id>
            <url>https://repo1.maven.org/maven2</url>
        </repository>
        <repository>
            <id>central</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public//</url>
        </repository>
    </repositories>   

所以一般來(lái)說(shuō)setting.xml只需要配置一個(gè)central的鏡像規(guī)則就好了,一般就是阿里云就好了,然后需要其他遠(yuǎn)程倉(cāng)庫(kù),就手動(dòng)在pom.xml里面加上repository,但不是這個(gè)第三方的倉(cāng)庫(kù)就不要把repository的id寫成central。不然就被鏡像的規(guī)則匹配到了,url被替換成阿里云的了。

setting.xml里面的mirror,可以寫多個(gè),但mirrorof的規(guī)則要從匹配范圍小到大寫。同時(shí)寫多個(gè)mirrorof的內(nèi)容為central的意義為0,因?yàn)橹挥衅渲械谝粋€(gè)mirror生效。

鏡像搭配遠(yuǎn)程倉(cāng)庫(kù)

一般setting.xml內(nèi)容為:

<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>  

假設(shè)某個(gè)jar包,阿里云鏡像沒(méi)有的jar,把可以下載這個(gè)jar包的遠(yuǎn)程倉(cāng)庫(kù),補(bǔ)充到pom.xml就好了。如:

   <repositories>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
  </repositories>
  • 有時(shí)公司搭建了內(nèi)網(wǎng),只能從私服下載jar包,這時(shí)maven項(xiàng)目,pom.xml的repository都是各個(gè)私服的url。

  • (假設(shè)都可以在阿里云倉(cāng)庫(kù)找到這些jar包,記住這里是假設(shè)所有的可以在阿里云的https://maven.aliyun.com/repository/central下載到?。。。┗氐郊依?,可以將阿里云的鏡像規(guī)則設(shè)置成 <mirrorOf>*</mirrorOf>,則強(qiáng)制所有遠(yuǎn)程倉(cāng)庫(kù)都到這個(gè)鏡像下載url。解決了不需要修改pom.xml。

<mirrors>
    <mirror>
       <id>aliyun-maven</id>    
       <name>aliyun maven</name>
       <url>https://maven.aliyun.com/repository/central</url>
       <mirrorOf>*</mirrorOf>
     </mirror> 
 </mirrors>

如果項(xiàng)目里面有些jar包在https://maven.aliyun.com/repository/central倉(cāng)庫(kù)找不到,那么setting.xml的mirrorOf 設(shè)置成*就不合適了。應(yīng)該將 <url>https://maven.aliyun.com/repository/central</url>設(shè)置成<mirrorOf>center</mirrorOf>,然后未找到的jar包再設(shè)置<mirrorOf>repository_name</mirrorOf>實(shí)現(xiàn)代理。


一般項(xiàng)目里面,我們應(yīng)該如何正確設(shè)置repositories和國(guó)內(nèi)鏡像呢

當(dāng)我們項(xiàng)目里面需要設(shè)置第三方的倉(cāng)庫(kù)時(shí),如cloudera的倉(cāng)庫(kù),那么建議<repositories>第一個(gè)先寫上<repository>倉(cāng)庫(kù)的id為center,再寫第三方的repository倉(cāng)庫(kù)的id和url。這樣項(xiàng)目里的jar的下載順序是從center的中央倉(cāng)庫(kù)(如果我們配置了國(guó)內(nèi)鏡像則從國(guó)內(nèi)倉(cāng)庫(kù))下載,如果找不到再輪到這個(gè)第三方的倉(cāng)庫(kù)。避免很多jar包在第三方倉(cāng)庫(kù)找不到然后再去center的下載,很慢,我們應(yīng)該讓依賴首先去中央倉(cāng)庫(kù)查找,找不到再去第三方倉(cāng)庫(kù)找。

下面是我的配置

pom.xml

    <repositories>
        <repository>
            <id>central</id>
            <url>https://maven.aliyun.com/repository/central</url>
        </repository>
        <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
    </repositories>   

setting.xml

    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>center</mirrorOf> 
        <name>阿里云公共倉(cāng)庫(kù)</name>
        <url>https://maven.aliyun.com/repository/central</url>
    </mirror>

這個(gè)配置,下載依賴的流程為:

  • 將repository中id為center的url替換成setting.xml中mirrorOf為center的url。(因?yàn)閞epository中id為center和setting.xml中mirrorOf為center所匹配,所以會(huì)將mirror的id為aliyunmaven的url替換掉pom里面id為center的repository。)
  • 下載依賴時(shí),先從central倉(cāng)庫(kù)下載,如果找不到則從cloudera的repository倉(cāng)庫(kù)查找。

有同學(xué)會(huì)有疑問(wèn):
pom.xml 這樣寫可不可以?

    <repositories>
     <repository>
            <id>cloudera</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
        </repository>
    </repositories>   

答案是可以的,但是如果seting.xml里面沒(méi)有配置國(guó)內(nèi)鏡像,那么從cloudera倉(cāng)庫(kù)里面查找鏡像,找不到鏡像,則從默認(rèn)id為center的中央倉(cāng)庫(kù)地址https://repo1.maven.org/maven2查找鏡像,下載速度會(huì)很慢,且下載順序是先cloudera倉(cāng)庫(kù)再center倉(cāng)庫(kù),這樣下載速度會(huì)比較慢,防止有些人沒(méi)有在setting.xml設(shè)置國(guó)內(nèi)中央倉(cāng)庫(kù)的鏡像,還是建議第一個(gè)repository的id為center,url為國(guó)內(nèi)的鏡像,一舉兩得。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容