2.1 maven配置多鏡像地址


背景:

  自己在平時寫項目用的是阿里的鏡像地址,而在開發公司的項目是用的是公司提供的鏡像地址,這就導致了每次使用的時候

都需要來回的修改maven的settings.xml文件,這樣很容易出錯,而且還浪費時間;

需求:希望能夠不改動配置文件的情況下,動態切換mirror配置;

分析:

  在maven的配置文件setting.xml大里面有個mirrors節點,用來配置鏡像URL。mirrors可以配置多個mirror,每個mirror有id,name,url,mirrorOf屬性,

id是唯一標識一個mirror,name節點名,url是官方的庫地址,mirrorOf代表了一個鏡像的替代位置,例如central就表示代替官方的中央庫。

 

雖然mirrors可以配置多個子節點,但是它只會使用其中的一個節點,即默認情況下配置多個mirror的情況下,只有第一個生效,只有當前一個mirror

無法連接的時候,才會去找后一個;而我們想要的效果是:當a.jar在第一個mirror中不存在的時候,maven會去第二個mirror中查詢下載,但是maven不會這樣做!)。

 

那么maven是使用哪個mirror節點的呢?

默認:mirror不是按settings.xml中寫的那樣的順序來查詢的,即所謂的第一個並不一定是最上面的那個。

   當有id為B,A,C的順序的mirror在mirrors節點中,maven會根據字母排序來指定第一個,所以不管怎么排列,
           一定會先找到A這個mirror來進行查找,當A無法連接,出現意外的情況下,才會去B查詢。

 

注意:

   配置多個mirror時,mirrorOf不能配置" * "," * " 的意思就是(根據mirrorOf和repository的id)匹配所有的倉庫(repository),

這樣就是說如果你需要某個jar,他會從鏡像地址去下載這個jar。不管你配置了多少個庫,即使這些庫的地址不一樣,仍然會從鏡像地址訪問。

解決辦法:

  settings.xml 中可以使用變量,可以嘗試使用變量解決:

<!-- mirror
     | Specifies a repository mirror site to use instead of a given repository. The repository that
     | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
     | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
     |
    <mirror>
-->
              <!-- 唯一標識一個mirror -->
      <id>mirrorId</id>
      <!-- 代表這個鏡像的替代位置,例如central就表示替代官方的中央倉庫。我們可以將這個地方設置為變量,然后通過手動指定變量地方式動態切換mirror -->
      <!-- mirrorOf指定這個鏡像是針對哪個repository的,配置成*就表示要代理所有repository的請求 -->
      <mirrorOf>repositoryId</mirrorOf>
      <!-- 名字(個人感覺這個name作用主要是給自己識別用,因為id已經在當前xml中唯一指定了一個mirror) -->
      <name>Human Readable Name for this Mirror.</name>
      <!-- 官方倉庫庫的地址 -->
      <url>http://my.repository.com/repo/path</url>
    </mirror>

實例:

<mirrors>
  <mirror>
    <id>aliyun</id>
    <url>https://maven.aliyun.com/repository/public</url>
    <mirrorOf>${aliyun}</mirrorOf>
  </mirror>
  <mirror>
    <id>netease</id>
    <url>http://mirrors.163.com/maven/repository/maven-public/</url>
    <mirrorOf>${netease}</mirrorOf>
  </mirror>
   <mirror>
    <id>default</id>
    <url>http://ip/nexus/repository/maven-public/</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>

切換命令:

配置多個mirror的情況下,默認只有第一個生效。因此我們可以把最后一個作為默認值,前面配置的使用環境變量動態切換。
默認執行: mvn help:effective-settings可以看到使用的是最后一個
切換阿里鏡像執行mvn help:effective-settings -Daliyun=central即可
同理,切換網易mvn help:effective-settings -Dnetease=central

 

參考:Maven 的 settings.xml 配置中的mirror節點

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

   Maven settings配置中的mirrorOf

   maven動態切換mirror,無需修改settings.xml 

      maven 中配置多個mirror的問題

 


免責聲明!

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



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