1. 程式人生 > 其它 >Maven映象(mirror)和Maven私服

Maven映象(mirror)和Maven私服

如果一個倉庫 A 可以提供另一個倉庫 B 的所有內容,那麼就可以認為倉庫 A 是倉庫 B 的一個映象。即倉庫 B 中的任何一個構件都能從它的映象中獲取。

使用映象代替中央倉庫

國內開發人員由於網路原因,直接從中央倉庫下載構件時,速度較慢或不穩定,我們通常會使用中央倉庫的國內映象站來解決該問題。

配置 Maven 映象的方法也非常的簡單,我們只需要在 Maven 安裝目錄中 setting.xml 檔案的 mirrors 節點中,使用 mirror 標籤新增映象的相關資訊即可。

目前國內使用最多,最穩定的中央倉庫映象分別是由阿里雲華為雲提供的,它們的地址配置如下。

阿里雲映象地址

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

華為雲映象地址

<mirror>
    <id>huaweicloud</id>
    <name>mirror from maven huaweicloud</name>
    <mirrorOf>central</mirrorOf>
    <url>https://repo.huaweicloud.com/repository/maven/</url>
</mirror>

以上配置中,mirrorOf 的取值為 central,表示該配置為中央倉庫的映象,所有對於中央倉庫的請求都會轉到該映象。當然,我們也可以使用以上方式配置其他倉庫的映象。另外三個元素 id、name 和 url 分別表示映象的唯一標識、名稱和地址。

映象與 Maven 私服配合使用

映象通常會和 Maven 私服配合使用,由於 Maven 私服可以代理所有外部的公共倉庫(包括中央倉庫),因此對於組織內部的使用者來說,使用一個私服就相當於使用了所有需要的外部倉庫,這樣就可以將配置集中到私服中,簡化 Maven 本身的配置。這種情況下,使用者所有所需的構件都可以從私服中獲取,此時私服就是所有倉庫的映象。

<srttings>
...
    <mirrors>
        <mirror>
            <id>nexus</id>
            <mirrorOf>*</mirrorOf>
            <name>nexus</name>
            <url>http://localhost:8082/nexus/content/groups/bianchengbang_repository_group/</url>
        </mirror>
    </mirrors>
...
</settings>

以上配置中,mirrorOf 元素的取值為 * ,表示匹配所有遠端倉庫,所有對於遠端倉庫的請求都會被攔截,並跳轉到 url 元素指定的地址。

為了滿足一些較為複雜的需求,Maven 還支援一些更為高階的配置。

  • <mirrorOf>*</mirrorOf>:匹配所有遠端倉庫。
  • <mirrorOf>external:*</mirrorOf>:匹配所有遠端倉庫,使用 localhost 和file:// 協議的除外。即,匹配所有不在本機上的遠端倉庫
  • <mirrorOf>repo1,repo2</mirrorOf>:匹配倉庫 repo1 和 repo2,使用逗號分隔多個遠端倉庫
  • <mirrorOf>*,!repo1</miiroOf>:匹配所有遠端倉庫,repo1 除外,使用感嘆號將倉庫從匹配中排除
需要注意的是,由於映象倉庫完全遮蔽了被映象倉庫,當映象倉庫不穩定或者停止服務時,Maven 也無法訪問被映象倉庫,因而將無法下載構件

Maven 私服搭建

能夠幫助我們建立私服的軟體被稱為 Maven 倉庫管理器(Repository Manager),主要有以下 3 種:

  • Apache Archiva
  • JFrog Artifactory
  • Sonatype Nexus


其中,Sonatype Nexus 是當前最流行,使用最廣泛的 Maven 倉庫管理器。您可以轉到《Nexus教程》學習 Maven 私服的搭建流程。

能夠幫助我們建立私服的軟體被稱為 Maven 倉庫管理器(Repository Manager),主要有以下 3 種:

  • Apache Archiva
  • JFrog Artifactory
  • Sonatype Nexus

Maven私服

Maven 私服是一種特殊的遠端倉庫,它是架設在區域網內的倉庫服務,用來代理位於外部的遠端倉庫(中央倉庫、其他遠端公共倉庫)。

建立了 Maven 私服後,當局域網內的使用者需要某個構件時,會按照如下順序進行請求和下載。

  1. 請求本地倉庫,若本地倉庫不存在所需構件,則跳轉到第 2 步;
  2. 請求 Maven 私服,將所需構件下載到本地倉庫,若私服中不存在所需構件,則跳轉到第 3 步。
  3. 請求外部的遠端倉庫,將所需構件下載並快取到 Maven 私服,若外部遠端倉庫不存在所需構件,則 Maven 直接報錯。


此外,一些無法從外部倉庫下載到的構件,也能從本地上傳到私服供其他人使用。

下圖中展示了 Maven 私服的用途。

Maven 私服優勢

Maven 私服具有以下 5 點優勢:

節省外網頻寬

大量對於外部遠端倉庫的重複請求,會消耗很大量的頻寬,利用 Maven 私服代理外部倉庫後,能夠消除對外部倉庫的大量重複請求,降低外網頻寬壓力。

下載速度更快

Maven 私服位於區域網內,從私服下載構建更快更穩定。

便於部署第三方構件

有些構件是無法從任何一個遠端倉庫中獲得的(例如,某公司或組織內部的私有構件、Oracle 的 JDBC 驅動等),建立私服之後,就可以將這些構件部署到私服中,供內部 Maven 專案使用。

提高專案的穩定性,增強對專案的控制

如果不建立私服,那麼 Maven 專案的構件就高度依賴外部的遠端倉庫,若外部網路不穩定,則專案的構建過程也會變得不穩定。
建立私服後,即使外部網路狀況不佳甚至中斷,只要私服中已經快取了所需的構件,Maven 也能夠正常執行。

此外,一些私服軟體(如 Nexus)還提供了很多額外控制功能,例如,許可權管理、RELEASE/SNAPSHOT 版本控制等,可以對倉庫進行一些更加高階的控制。

降低中央倉庫得負荷壓力

由於私服會快取中央倉庫得構件,避免了很多對中央倉庫的重複下載,降低了中央倉庫的負荷。

Maven 私服搭建

能夠幫助我們建立 Maven 私服的軟體被稱為 Maven 倉庫管理器(Repository Manager),主要有以下 3 種:

  • Apache Archiva
  • JFrog Artifactory
  • Sonatype Nexus

其中,Sonatype Nexus 是當前最流行、使用最廣泛的 Maven 倉庫管理器,您可以轉到《Nexus教程》學習 Maven 私服的搭建流程。