1. 程式人生 > 程式設計 >maven倉庫repositories和mirrors的配置及區別詳解

maven倉庫repositories和mirrors的配置及區別詳解

maven倉庫配置

倉庫優先順序為:本地倉庫(localRepositories) > profile中的repositories倉庫 > POM > mirrors全域性倉庫

通過mirror配置

如果倉庫X可以提供倉庫Y所有的內容,那麼我們就可以認為X是Y的一個映象,通俗點說,可以從Y獲取的構件都可以從他的映象中進行獲取。可以採用映象的方式配置遠端倉庫,映象在settings.xml中進行配置,在setting.xml中的<mirrors>標籤下加入如下子標籤配置便配置了一個maven映象。

<mirror>
  <id>alimaven</id>
  <name>aliyun maven</name>
  <!--mirrorOf的配置很重要後面會詳細說明-->
  <mirrorOf>central</mirrorOf>
  <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>

新增如上配置後,maven會讀取setting.xml中配置的mirror作為jar包的下載地址,我們以在專案中下載fastjson為例來看一下效果。

maven倉庫repositories和mirrors的配置及區別詳解

maven倉庫repositories和mirrors的配置及區別詳解

可以看到,配置了上面的mirror後,maven是從aliyun倉庫下載的jar包,不配置的時候,預設從apache的maven中央倉庫下載的jar包。

上面提到,<mirrorOf></mirrorOf>的設定很重要,比如上面我設定的mirrorOf為<mirrorOf>central</mirrorOf>,如果<mirrorOf></mirrorOf>我隨便設定一個引數,如<mirrorOf>abc</mirrorOf>,這時候我們配置的倉庫就不起作用了,這是因為maven預設內建瞭如下一個倉庫,這個預設倉庫的id為central,當我們把mirrorOf設定為<mirrorOf>central</mirrorOf>時,maven就會查詢有沒有id為central的倉庫,然後把id為central的倉庫地址換成我們<mirror>標籤配置的那個url,這樣我們配置的mirror才會起作用。當然我們也可以把mirrorOf設定為<mirrorOf>*</mirrorOf>,表示所有倉庫都使用我們配置的這個mirror作為jar包下載地址。

<repositories>
  <repository>
   <id>central</id>
   <name>Central Repository</name>
   <url>https://repo.maven.apache.org/maven2</url>
   <layout>default</layout>
   <snapshots>
    <enabled>false</enabled>
   </snapshots>
  </repository>
</repositories>

通過<repositories>配置

通過setting.xml方式配置會對所有maven專案生效,如果只想在本專案中配置一個maven倉庫,可以通過在pom.xml中配置<repositories>標籤來實現。在自己的maven專案的pom.xml中新增如下配置,就配置好了一個倉庫。這時候,maven會優先採用這個配置,而不會去讀setting.xml中的配置了。這樣配置好後,maven就會自動從aliyun下載jar包了。

 <repositories>
  <repository>
    <id>aliyun-releases</id>
    <name>阿里雲倉庫(name可以隨便起)</name>
    <url>https://maven.aliyun.com/repository/public</url>
  </repository>
</repositories>

我們知道,repositories標籤下可以配置多個repository,如果我們配置了多個repository,maven會用哪個呢,答案是按出現順序使用,如果第1個可用,就用第一個,如果不可用,就依次往下找,下面的2張圖片可以說明這個問題。

maven倉庫repositories和mirrors的配置及區別詳解

maven倉庫repositories和mirrors的配置及區別詳解

上面配置<repository>時<id>似乎也沒什麼用,確實是,如果你只是在pom.xml中配置個倉庫,這個id是沒什麼用的,可以隨便寫,其實這個id是配合上面講的mirror一塊使用的,還記得mirrorOf嗎,我們配置mirrorOf為<mirrorOf>central</mirrorOf>是,mirror中的url就是central倉庫的url給覆蓋了,所以這裡的<repository>標籤下的id是給mirrorOf用的。

可以看下面一個例子,本來我們的abc-releases這個倉庫是不可用的,因為根本就沒有https://abc.def.com/repository/public/這個倉庫,但是我們通過mirror配置,改變了id為abc-releases這個倉庫的url,從而使用maven也可以從id為abc-releases這個倉庫下載jar包了。當然這樣配置也沒只啥意義,只是為了方便理解repository和mirror之間的關係。

maven倉庫repositories和mirrors的配置及區別詳解

maven倉庫配置的其他選項

<!--releases和snapshots中有個enabled屬性,是個boolean值,預設為true,
表示是否需要從這個遠端倉庫中下載穩定版本或者快照版本的構建,
一般使用第三方的倉庫,都是下載穩定版本的構建。-->
<repository>
  <id>aliyun-releases</id>
  <url>https://maven.aliyun.com/repository/public</url>
  <releases>
    <enabled>true</enabled>
  </releases>
  <snapshots>
    <enabled>false</enabled>
  </snapshots>
</repository>

maven預設的內建倉庫的配置位置

<!--
可以從以下檔案中找到maven倉庫的預設配置如下
apache-maven-3.6.1\lib\maven-model-builder-3.6.1.jar\org\apache\maven\model\pom-4.0.0.xml
-->
<repositories>
  <repository>
   <id>central</id>
   <name>Central Repository</name>
   <url>https://repo.maven.apache.org/maven2</url>
   <layout>default</layout>
   <snapshots>
    <enabled>false</enabled>
   </snapshots>
  </repository>
</repositories>

到此這篇關於maven倉庫repositories和mirrors的配置及區別詳解的文章就介紹到這了,更多相關maven倉庫repositories和mirrors配置內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!