maven 建立本地倉庫

xz43發表於2015-11-26

這一個章節,分兩部分來介紹,首先介紹一下 Maven 的倉庫,然後再說一下如何透過 Nexus 來建立我們自己的倉庫,以及如何使用。

Maven 倉庫

在以前使用 Ant 的時候,我們會建立一個 lib 目錄存放我們的 jar 包,比如專案所依賴的第三方包,每建立一個專案都要建立一個 lib ,不停的做 copy 工作,不僅是對於磁碟的浪費,而且也造成了版本管理上的麻煩。而且我們還需要透過提交到 svn 上來對 lib 進行管理,但是 svn 對於這種二進位制檔案的管理並不出色。

Maven 倉庫的初衷就是為了解決這個問題,是所有常用的第三方包的集中營。這樣所有的 Maven 專案就可以從這個倉庫中獲取所需要的資源, Maven 倉庫中對 jar 透過 Group Id, Atifact Id, version 來管理 ,所以 Maven 專案可以很方便的進行依賴管理。你不需要自己來管理這個龐大的資源倉庫,當然你可以建立一個公司層面的倉庫管理器,這個在這個章節的後面會介紹。

Maven 倉庫的兩個概念:本地倉庫和遠端倉庫

本地倉庫是遠端倉庫的一個緩衝和子集,當你構建 Maven 專案的時候,首先會從本地倉庫查詢資源,如果沒有,那麼Maven 會從遠端倉庫下載到你本地倉庫。這樣在你下次使用的時候就不需要從遠端下載了。如果你所需要的 jar 包版本在本地倉庫沒有,而且也不存在於遠端倉庫, Maven 在構建的時候會報錯,這種情況可能發生在有些 jar 包的新版本沒有在Maven 倉庫中及時更新。

Maven 預設的本地倉庫地址為 ${user.home}/.m2/repository 。也就是說,一個使用者會對應的擁有一個本地倉庫。當然你可以透過修改 ${user.home}/.m2/settings.xml 配置這個地址:

Xml程式碼

  1. <settings>
  2.  ...
  3.  <localRepository> D:/java/repository </localRepository>
  4.  ...
  5. </settings>

如果你想讓所有的使用者使用統一的配置那麼你可以修改 Maven 主目錄下的 setting.xml:

${M2_HOME}/conf/setting.xml

還可以透過在執行時指定目錄,但是並不推薦這麼做:

mvn clean install -Dmaven.repo.local=/home/juven/myrepo/

當我們建立一個簡單的 Maven 專案後 ( 只需要在 pom.xml 配置好依賴 ) ,執行 mvn clean install 就可以把專案構建好,不需要我們手工下載任何 jar ,這全靠中央倉庫的存在,它會自動從倉庫下載。這個倉庫的定義是在 ${M2_HOME}/lib/maven-2.0.10-uber.jar 裡面。你可以在裡面找到 /org/apache/maven/project/pom-4.0.0.xml 這個檔案,在這個檔案裡面定義了中央倉庫的地址:

  1. <repositories>
  2.  <repository>
  3.  <id> central </id>
  4.  <name> Maven Repository Switchboard </name>
  5.  <layout> default </layout>
  6.  <url>  </url>
  7.  <snapshots>
  8.  <enabled> false </enabled>
  9.  </snapshots>
  10.  </repository>
  11. </repositories>

 POM 中配置遠端倉庫

下面介紹如何在 pom.xml 裡面配置遠端倉庫,我們需要在什麼時候配置遠端倉庫呢?當你連線中央倉庫的速度比較慢時,或者你為你的公司搭建了自己的倉庫,比如 Nexus 倉庫管理 ( 後面會介紹 ) ,又或者你所需要的 jar 存在另外一個公共倉庫,比如我們配置一個國內的映象地址:

  1. <project>
  2. ...
  3.  <repositories>
  4.  <repository>
  5.  <id> maven-net-cn </id>
  6.  <name> Maven China Mirror </name>
  7.  <url>  </url>
  8.  <releases>
  9.  <enabled> true </enabled>
  10.  </releases>
  11.  <snapshots>
  12.  <enabled> false </enabled>
  13.  </snapshots>
  14.  </repository>
  15.  </repositories>
  16.  <pluginRepositories>
  17.  <pluginRepository>
  18.  <id> maven-net-cn </id>
  19.  <name> Maven China Mirror </name>
  20.  <url>  </url>
  21.  <releases>
  22.  <enabled> true </enabled>
  23.  </releases>
  24.  <snapshots>
  25.  <enabled> false </enabled>
  26.  </snapshots>
  27.  </pluginRepository>
  28.  </pluginRepositories>
  29. ...
  30. </project>

這裡我們可以看到 ,允許配置多個 repository  plugin repository  < releases><enabled>true</enabled></releases> 告訴Maven 可以從這個倉庫下載 releases 版本的構件,而 <snapshots><enabled>false</enabled></snapshots> 告訴 Maven 不要從這個倉庫下載 snapshot 版本的構件,之所以不讓你從這個倉庫下載 snapshot 版本,是因為這些版本是不穩定的,但是snapshot 版本在我們內部專案開發的時候可是作用巨大,後面的問文章我會討論這個問題。 至於 <pluginRepositories> ,這是配置 Maven 從什麼地方下載外掛構件, Maven 的所有行為都是透過外掛來完成的,其內部配置與 < repository > 類似,這裡就不多說了。

儘管 pom.xml 中可以方便的配置中央倉庫,但是我並不推薦大家這麼做,尤其是在大的公司中,因為一個公司會有很多的專案,如果每個專案都這樣配置,那麼又開始做重複的 copy 工作了,如何解決呢,我們往下走

 settings.xml 中配置遠端倉庫

pom.xml 的作用範圍是一個專案,一個公司不可能只做一個專案,那麼為了避免重複配置,那麼我們需要把一些公共資訊配置在 setting.xml 中。但是 setting.xml 中並不支援 <repositories>  <pluginRepositories > ,為了解決這個問題我們使用profile 

  1. <settings>
  2.  ...
  3.  <profiles>
  4.  <profile>
  5.  <id> myProfiel </id>
  6.  <!—在這裡加入 <repositories>  <pluginRepositories > -->
  7.  </profile>
  8.  </profiles>
  9.  <activeProfiles>
  10.  <activeProfile> myProfiel </activeProfile>
  11.  </activeProfiles>
  12.  ...
  13. </settings>

這裡透過 <activeProfile> 元素來啟用這個 profile ,這樣我們就可以全域性的使用這個配置,不再需要為每個 POM 做重複的配置了。

在實際的操作過程中,這裡我們最好不要配置遠端倉庫,最好能夠透過 nexus 建立公司或者組織自己的倉庫,然後這把這地址指向自己的倉庫,後面我會介紹為什麼要這麼做,怎麼做。

配置映象

如果你想覆蓋中央倉庫的預設地址,那麼這裡我們就會使用映象,還在 setting.xml 裡面配置:

  1. <settings>
  2. ...
  3.  <mirrors>
  4.  <mirror>
  5.  <id> maven-net-cn </id>
  6.  <name> Maven China Mirror </name>
  7.  <url>  </url>
  8.  <mirrorOf> central </mirrorOf>
  9.  </mirror>
  10.  </mirrors>
  11. ...
  12. </settings>

這裡解釋一下 <mirrorOf>, 表示只為 central 倉庫做映象,如果想為所有的倉庫做映象那麼可以改為: <mirrorOf>*</mirrorOf>

如果你看到這裡,請先不要著急,實際的專案經驗告訴我,只是這些還不夠,我們需要更快捷和高效的管理:

利用 Nexus 來構建企業級 Maven 倉庫

Nexus 簡介

Nexus  Maven 倉庫管理器,用來搭建一個本地倉庫伺服器,這樣做的好處是便於管理,節省網路資源,速度快,還有一個非常有用的功能就是可以透過專案的 SNAPSHOT 版本管理,來進行模組間的高效依賴開發,下面會一一描述。

雖然你可以透過中央倉庫來獲取你所需要的 jar 包,但是現實往往是存在很多問題:

  1. 網速慢,你可能需要花很長的時間來下載你所需要的 jar
  2. 如果你的公司很大,有幾百甚至幾千人在用 Maven ,那麼這些人都去透過中央倉庫來獲取 jar ,那麼這是一個很大的資源浪費
  3. 如果存在模組之間的依賴開發,你的 snapshot 版本是不能夠被你的夥伴很方便的獲取。
  4. 在實際開發過程中,有些 jar 的版本可能在中央倉庫裡面不存在,或者更新不及時 ,你是獲取不到這個 jar 的。

所有以上問題,透過 Nexus 這個日益流行的倉庫管理器可以輕鬆的解決。

    1. 這個倉庫是本地的,下載的速度是從遠端下載不可比的。
    2. 可以為你公司所有的 Maven 使用者服務,可以進行統一管理
    3. 後面我會介紹如何透過 nexus 來進行存在模組依賴的專案的開發
    4. 你可以新增自己的第三方包。

安裝 Nexus

我們從 

Nexus 提供了兩種安裝方式,一種是內嵌 Jetty  bundle ,只要你有 JRE 就能直接執行。第二種方式是 WAR ,你只須簡單的將其釋出到 web 容器中即可使用。

1  Bundle 方式安裝

解壓nexus-webapp-1.3.4-bundle.zip至任意目錄,如 D:/tools轉到目錄D:/tools/nexus-webapp-1.3.4/bin/jsw/windows-x86-32,執行Nexus.bat,如果你是在linux下安裝,那麼就下載nexus-webapp-1.3.4-bundle.tar.gz,解壓後轉到${NEXUS_HOME}/nexus-webapp-1.3.3/bin/jsw/linux-x86-32,它還支援solaris,macos等作業系統。當你看到“Started SelectChannelConnector@0.0.0.0:8081”之後,說明Nexus啟動成功了,然後開啟瀏覽器,訪問,透過admin的帳號(admin)和密碼(admin123)登入,你會看到如下的頁面:

如果有新版本釋出,會有提示在預設頁面上。

這裡,可以管理倉庫,配置 Nexus 系統,管理任務,管理使用者,角色,許可權,檢視系統的 RSS 源,管理及檢視系統日誌,等等。

War 方式安裝

你可以透過 war 的方式以 web 應用的形式釋出到你的應用伺服器,比如 tomcat 。你所要做的就是下載 war 版本的檔案,然後放到應用伺服器的釋出目錄即可,這裡就不多講了。

到此我們已經安裝好 Nexus, 下面我來介紹下一些我們常用的功能和使用:

配置中央倉庫

先看一下介面:

在左邊選單欄裡選擇 Repositories ,然後會出現右邊的畫面,右邊上半部分是列出來的 repository ,黑體字是型別為group  repository. 這裡簡單介紹下幾種 repository 的型別 :

  • hosted,本地倉庫,通常我們會部署自己的構件到這一型別的倉庫。比如公司的第二方庫
  • proxy,代理倉庫,它們被用來代理遠端的公共倉庫,如maven中央倉庫。
  • group,倉庫組,用來合併多個hosted/proxy倉庫,當你的專案希望在多個repository使用資源時就不需要多次引用,只需要引用一個group即可。

Maven central是Maven的中央倉庫,點選它並選擇configuration標籤欄,我們會看到下面的頁面:

這裡有幾個專案是我們可能會經常用到的:

  1. Override local storage location: 在這個選項你可以配置你的 Nexus 本地倉庫的存放地址 ,用來覆蓋其預設的存放地址
  2. Remote storage location: 這裡是遠端倉庫的地址,為了提高代理速度,你可以修改為國內的映象地址。預設值是/
  3. Download remote indexes: 這裡配置是否下載遠端索引檔案,模式是 false, 建議配置為 true ,這樣我們便可以透過索引檔案來搜尋我們需要的構件。

新增代理倉庫

Maven central 是一個比較大的代理倉庫,如果你需要新增的一個代理倉庫,那麼可以在 點選左邊慘淡欄裡面的Repositories, 然後右邊的頁面點選 add -> add proxy repository, 之後出現以下頁面:

填寫相關資訊儲存即可。 通常情況下 , 使用預設的代理倉庫已經能夠滿足大部分專案的需求了 只有在特殊需求的情況下才會參加代理倉庫 .

管理本地倉庫

我們前面講到型別為 hosted 的為本地倉庫, Nexus 預定義了 3 個本地倉庫,分別是 Releases, Snapshots, 3 rd Party. 分別講一下這三個預置的倉庫都是做什麼用的 :

  1. Releases: 這裡存放我們自己專案中釋出的構建 通常是 Release 版本的 比如我們自己做了一個 FTP Server 的專案 生成的構件為 ftpserver.war, 我們就可以把這個構建釋出到 Nexus  Releases 本地倉庫 關於符合釋出後面會有介紹 .
  2. Snapshots: 這個倉庫非常的有用 它的目的是讓我們可以釋出那些非 release 版本 非穩定版本 比如我們在 trunk 下開發一個專案 , 在正式 release 之前你可能需要臨時釋出一個版本給你的同伴使用 因為你的同伴正在依賴你的模組開發那麼這個時候我們就可以釋出 Snapshot 版本到這個倉庫 你的同伴就可以透過簡單的命令來獲取和使用這個臨時版本 .
  3. 3 rd Party: 顧名思義 第三方庫 你可能會問不是有中央倉庫來管理第三方庫嘛 沒錯 這裡的是指可以讓你新增自己的第三方庫 比如有些構件在中央倉庫是不存在的 比如你在中央倉庫找不到 Oracle  JDBC 驅動 這個時候我們就需要自己新增到 3rd party 倉庫 .
  4. 你也可以建立自己的本地倉庫,點選 Repository 皮膚上方的 Add 按鈕,然後選擇 Hosted Repository ,然後在下方的配置皮膚中輸入相關資訊 這裡我們不再需要填寫遠端倉庫地址,根據自己的需要選擇 Release 或者 Snapshot ,如圖:

Maven 倉庫組

倉庫組的概念是 Maven 沒有的 , 透過前面介紹可以瞭解到 我們可以建立多個 proxy 代理倉庫 ,hosted 本地倉庫 如果沒有倉庫組的概念 , 我們如果需要引用這些倉庫的是時候需要一一加入到我們的 setting.xml 裡面去 有了倉庫的組的概念 我們只需要做一次引用就可以了 , 把我們需要的倉庫加入到倉庫組即可 . 像這樣 :

<repositories>

<repository>

<id>nexus</id>

<url>http:// 127.0.0.1 :8081/nexus/content/groups/public/</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>true</enabled>

</snapshots>

</repository>

</repositories>

Nexus 中預設了 2 個倉庫組 , public repositories  public snapshot repositories. 如圖 :

這個倉庫組預設包含本地倉庫 Releases, snapshots, 3 rd party 和代理倉庫 Maven Central. 你可以在 Configuration 配置頁新增倉庫到這個倉庫組 . 如果需要你還可以建立一個倉庫組 , 如圖 :

點選 Add->Repository Group

出現 New Repository Group 介面後 , 填入 ID, name 等相關資訊 在右邊 Available Repositories 欄裡可以選擇你要新增的倉庫 到你 新建的倉庫組 .

透過 Nexus 搜尋構件

在我們實際使用構件的過程中通常遇到一個問題 , 有時候我緊緊知道我所需要的構建的大致名字 , 並不知道全稱或group id, 這是件非常頭疼的事情 . Nexus 基於 Nexus indexer 的搜尋功能幫我們解決了這個問題 .

要是用搜尋功能 必須要有索引檔案 Nexus 預設是不建立索引檔案的 , 因為像中央倉庫這樣的索引檔案的建立需要耗費比較大的網路資源 , 僅索引檔案就要幾十兆 要開啟中央倉庫的索引檔案下載功能需要在 Maven Central 的配置頁面 , Download Remote Indexes 選擇 true. 如圖 :

這樣設定以後 , Nexus 會自動從遠端中央倉庫下載索引檔案 為了檢驗索引檔案自動下載是否生效 , 可以卻換到 Browse:

如果出現先以上資料夾 , 那說明索引檔案已經建立 .

下面我試一下搜尋功能 在左邊選單欄裡面有個 Artifact Search, 在輸入框裡面輸入你想要搜尋的構件名字 , 比如 :testing 那麼查詢結果如下:

這是模糊查詢的結果,當然如果你知道更多資訊,比如版本號等,你可以使用高階搜尋,點選高階搜尋後,右邊介面會提供集中搜尋方式: keyword, classname, GAV, checksum

比如我們這裡選擇 GAV 模式 而且我只知道 artiface name : testng 和版本號 5.8, 其他的我不知道 那麼就在 artifact version 處分別輸入 testng  5.8 , 搜尋結果如下 :

你如果你不知道知道構件的名稱 只知道 classname, 那麼你也可以透過 class name 的方式搜尋 , 這裡就不再 贅述

當你選擇一項搜尋結果 , 在頁面的下方會出現這個構件的詳細資訊 並且會列出這個構件的 Maven 依賴配置 你可以直接複製到你的 pom 檔案中使用 , 這是個非常實用的功能 :

 Maven 中使用 Nexus

到此為止我們介紹瞭如何安裝和使用 Nexus 以及其基本配置 下面我們介紹下如何讓 Maven 來使用 Nexus 本地倉庫用來替代使用遠端倉庫  Maven 使用 Nexus 本地倉庫只需稍作配置  settings.xml 中加入以下程式碼 :

<profile>

<id>dev</id>

<repositories>

<repository>

<id>nexus</id>

<url>http:// 127.0.0.1 :8081/nexus/content/groups/public/</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>true</enabled>

</snapshots>

</repository>

</repositories>

<pluginRepositories>

<pluginRepository>

<id>nexus</id>

<url> . 0.0.1:8081/nexus/content/groups/public</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>true</enabled>

</snapshots>

</pluginRepository>

</pluginRepositories>

</profile>

</profiles>

<activeProfiles>

<activeProfile>dev</activeProfile>

</activeProfiles>

這裡配置了 repository  pluginRepository, Maven 在使用第三方構件和外掛時是分開來配置的 , 所以如果我們也希望外掛的下載也透過我們的本地倉庫來下載 , 那麼我們就需要配置 pluginRepository.

紅色字型部分就是我們之前安裝的 Nexus 的地址 這個地址可以是你們公司區域網內部的一臺倉庫伺服器 .

<releases> <enabled>true</enabled></releases> 這個標籤的作用是設定是否允許 下載

release 版本  載構件 同樣 snapshots 標籤可以設定是否允許 下載 snapshot 版本 的構件 .

通常 , 我們不建議下載 snapshot 版本的構件 , 因為它是不穩定的版本 除非你有特殊的需

 .

構件部署

有些時候我們需要部署構件到 Nexus  3rd party, 比如我們在中央倉庫找不到我們需要的構件 我們可以透過 Nexus  UI來上傳構件 :

點選左邊選單欄的 Repositories, 然後點選右邊介面的 3rd party, 選擇介面下方的 Artifact Upload, 這個時候出現以下介面 :

上傳構件需要兩個步驟 , 一個是定義檔案的上傳 , 再就是構件的實體檔案 .

第一部分定義檔案可以是 POM 檔案 這也是比較推薦的方式 如果沒有 pom 檔案 , 可以

選擇以引數的形式輸入 .

第二部分是上傳構件的實體檔案 , 這裡簡單說一下 Classifier  Extension, 這兩個都是選

填相 , Classifier 用來區別同功能的構件用於不同的場景 比如這個構件是分別針對 JDK14

 JDK15 做了 2 個功能一樣的 Jar, 這個時候你就需要指定這個構件的 Classifier  JDK14

還是 JDK15. Extension 是指副檔名 , 如果不提供 , 那麼會自動取這個構件的 Packaging Type

作為副檔名 比如 ear, jar, war 等等 . (Packaging Type 是在第一步中透過 pom 檔案或者手

工輸入得到的 )

剛才說了 3rd party 的部署 關於 releases  snapshots  UI 部署也是一樣的操作過程 .

我們之前也講過 這裡的 releases  snapshots 是用來部署我們自己的專案構件的 透過

UI 部署是可以 , 但是不是最高效的 我們可以透過配置 Maven 來自動部署我們的專案構

 , 這也是我們建立自己的倉庫的一個非常重要的原因 下面就讓我們看看如何配置 :

首先需要在 POM 檔案中加入以下程式碼 :

  1. <project>
  2. ...
  3. <distributionManagement>
  4.  <repository>
  5.  <id> nexus-releases </id>
  6.  <name> Nexus Release Repository </name>
  7.  <url> .0.0.1:8081 /nexus/content/repositories/releases/ </url>
  8.  </repository>
  9.  <snapshotRepository>
  10.  <id> nexus-snapshots </id>
  11.  <name> Nexus Snapshot Repository </name>
  12.  <url> .0.0.1:8081 /nexus/content/repositories/snapshots/ </url>
  13.  </snapshotRepository>
  14. </distributionManagement>
  15. ...
  16. </project>

這裡配置 ,  Maven 知道當我要釋出 release 版本或者 snapshot 版本是需要釋出到哪個地址 .

然後我們需要在 setting.xml 裡面配置一下 Nexus 的帳號和密碼 :

  1. <settings>
  2. ...
  3. <servers>
  4.  <server>
  5.  <id> nexus-releases </id>
  6.  <username> admin </username>
  7.  <password> admin123 </password>
  8.  </server>
  9.  <server>
  10.  <id> nexus-snapshots </id>
  11.  <username> admin </username>
  12.  <password> admin123 </password>
  13.  </server>
  14. </servers>
  15. ...
  16. </settings>

到此為止 我們就可以透過命令 mvn deploy 或者透過 IDE 的視覺化介面點選 deploy 來發布我們專案到本地倉庫了 透過這種方式我們可以很方便的進行模組間的依賴開發 在後面的文章中我會詳細介紹如何透過 snapshot 來讓我們的依賴開發變得簡單 .

小結

本文介紹了 Maven 倉庫 如何透過 Nexus 建立自己本地倉庫 透過和遠端倉庫的比較 我們知道 Nexus 給我帶來很多方便之處 方便我們管理 方便我們的專案構件部署 專案的依賴開發等 還在等什麼 建立你自己的倉庫吧

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-1847561/,如需轉載,請註明出處,否則將追究法律責任。

相關文章