maven的setting配置文件中mirror和repository的區別


當maven需要到的依賴jar包不在本地倉庫時, 就需要到遠程倉庫下載 .

這個時候如果mavensetting.xml中配置了鏡像 , 而且鏡像配置的規則中匹配到目標倉庫時 ,
maven認為目標倉庫被鏡像了, 不會再去被鏡像倉庫下載依賴jar包, 而是直接去鏡像倉庫下載.

簡單而言, mirror可以攔截對遠程倉庫的請求 , 改變對目標倉庫的下載地址

repository

repository就是個倉庫.

maven里有兩種倉庫,本地倉庫和遠程倉庫。

遠程倉庫相當於公共的倉庫,大家都能看到。

本地倉庫是你本地的緩存副本,只有你看的到,主要起緩存作用。

當你向倉庫請求插件或依賴的時候,會先檢查本地倉庫里是否有。

如果有則直接返回,否則會向遠程倉庫請求,並被緩存到本地倉庫。

遠程倉庫可以在工程的pom.xml文件里指定。

如果沒指定,默認會到http://repo1.maven.org/maven2這個地方去請求插件和依賴包。

*<repository> * 
            
  •  </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>snapshots</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">  *
    
  •  </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>enabled</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">false</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>enabled</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">  *
    
  •  </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>snapshots</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">  *
    
  •  </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>id</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">central</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>id</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">  *
    
  •  </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>name</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">Maven Repository Switchboard</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>name</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">  *
    
  •  </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>url</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">**[http://repo1.maven.org/maven2</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>url</span><span class="token punctuation">&gt;</span></span><span class="token plain-text">*
    
  • </repository> *

本地倉庫默認在你本地的用戶目錄下的.m2/repository目錄下。

mirror

mirror就是鏡像,主要提供一個方便地切換遠程倉庫地址的途徑。

比如,上班的時候在公司,用電信的網絡,連的是電信的倉庫。

回到家后,是網通的網絡,我想連網通的倉庫,就可以通過mirror配置,統一把我工程里的倉庫地址都改成聯通的,而不用到具體工程配置文件里一個一個地改地址。

mirror的配置在.m2/settings.xml里。如:


*<mirrors> * 
             

</mirrors>

這樣的話,就會給上面id為central的遠程倉庫做了個鏡像。

以后向central這個倉庫發的請求都會發到http://uk.maven.org/maven2而不是http://repo1.maven.org/maven2了。

<mirrorOf>central</mirrorOf>里是要替代的倉庫的id。

如果填*,就會替代所有倉庫。

高級鏡像配置

為了滿足一些復雜的需求,Maven還支持更高級的鏡像配置:

1.<mirrorOf>*</mirrorOf>

匹配所有遠程倉庫。

2.<mirrorOf>external:*</mirrorOf>

匹配所有遠程倉庫,使用localhost的除外,使用file://協議的除外。也就是說,匹配所有不在本機上的遠程倉庫。

3.<mirrorOf>repo1,repo2</mirrorOf>

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

4.<mirrorOf>*,!repo1</miiroOf>

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

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

例子

個人的maven配置了阿里的鏡像 , 而項目中需要使用到一些第三方jar包, 為了方便引入 , 已上傳到192.168.0.201的nexus私服下.

但由於個人maven阿里的鏡像使用默認mirrorOf規則=*, 所有的倉庫都被鏡像 , 不會再去192.168.0.201下下載第三方jar包

上傳的第三方jar包目標路徑 :
http://192.168.0.201:8081/nexus/content/groups/public/com/alipay/sdk-java/20170615110434/sdk-java-20170615110434.pom
被鏡像后路徑 :
http://maven.aliyun.com/nexus/content/groups/public/com/alipay/sdk-java/20170615110434/sdk-java-20170615110434.pom

所以需要修改鏡像的mirrorOf規則 , 避免默認從鏡像中下載

maven的conf/setting.xml

  <mirrors>
        <!--國內阿里雲提供的鏡像,非常不錯-->
    <mirror>
        <!--This sends everything else to /public -->
        <id>aliyun_nexus</id>
        <!--對所有倉庫使用該鏡像,除了一個名為maven_nexus_201的倉庫除外-->
        <!--這個名為maven_nexus_201的倉庫可以在javamaven項目中配置一個repository-->
        <mirrorOf>*,!maven_nexus_201</mirrorOf> 
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>
  </mirrors>

maven項目下的pom.xml配置一個遠程倉庫

<repositories>
        <!-- 192.168.0.201遠程倉庫 -->
        <repository>
            <id>maven_nexus_201</id>
            <name>maven_nexus_201</name>
            <layout>default</layout>
            <url>http://192.168.0.201:8081/nexus/content/groups/public/</url>
            <snapshots>  
                <enabled>true</enabled>  
              </snapshots>
        </repository>
</repositories>

http://192.168.0.201:8081/nexus下上傳第三方jar包依賴

參見 : https://jingyan.baidu.com/article/a948d6517b72eb0a2dcd2e2a.html

  1. 登陸已經安裝好的nexus私有倉庫,如圖:

  2. 點擊左邊菜單“Repositories”,選擇右邊列表“3rd party“

  3. 點擊“3rd party”,選擇artifact Upload,如下圖:

  4. 在artifact Upload界面顯示的有GAV Parameter,groupId,artifactId,Version,Packaging等等參數,界面如圖:

  5. 將以上參數填完之后,選擇要上傳的jar包,點擊”add artifact“,最后點擊”save“保存按鈕即可,如下圖所示:

maven項目下的pom.xml引入依賴

<dependency>
    <groupId>com.alipay</groupId>
    <artifactId>sdk-java</artifactId>
    <version>20170615110434</version>
</dependency>
原文地址:https://www.jianshu.com/p/274c363ffd7c


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM