Maven倉庫管理之Nexus

     我分兩部分來介紹,首先介紹一下Maven的倉庫,而後在說一下如何經過Nexus來創建咱們本身的倉庫,以及如何使用。 java

Maven 倉庫

    在之前使用Ant的時候,咱們會創建一個lib目錄在存放咱們的jar包,好比項目所依賴的第三方包,每創建一個項目都要創建一個lib,不停的作copy工做,不只是對於磁盤的浪費,並且也形成了版本管理上的麻煩。並且咱們還須要經過提交到svn上來對lib進行管理,可是svn對於這種二進制文件的管理並不出色。  linux

    Maven倉庫的初衷就是爲了解決這個問題。 maven倉庫是全部經常使用的第三方依賴包的集中營。這樣全部的Maven項目就能夠從這個倉庫中獲取所須要的資源,Maven倉庫中對jar經過Group Id, Atifact Id, version 來管理,因此Maven項目能夠很方便的進行依賴管理。你不須要本身來管理這個龐大的資源倉庫,固然你能夠建立一個公司層面的倉庫,這個我在這個章節的後面會介紹。 web

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

     本地倉庫是遠程倉庫的一個緩衝和子集,當你構建Maven項目的時候,首先會從本地倉庫查找資源,若是沒有,那麼Maven會從遠程倉庫下載到你本地倉庫。這樣在你下次使用的時候就不須要從遠程下載了。若是你所須要的jar包版本在本地倉庫沒有,並且也不存在於遠程倉庫,Maven在構建的時候會報錯,這種狀況可能發生在有些jar包的新版本沒有在Maven倉庫中及時更新。 shell

    Maven缺省的本地倉庫地址爲${user.home}/.m2/repository 。也就是說,一個用戶會對應的擁有一個本地倉庫。固然你能夠經過修改${user.home}/.m2/settings.xml 配置這個地址: macos

<settings>   
...
  <localRepository> D:/java/repository</localRepository>   
  ...
</settings>


若是你想讓全部的用戶使用統一的配置,那麼你能夠修改${M2_HOME}/conf/setting.xml apache

 還能夠經過在運行時指定目錄(不推薦這麼作): 數組

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


    當咱們建立一個簡單的Maven項目後(只須要在pom.xml配置好依賴項),運行mvn clean install就能夠把項目構建好,maven會自動從中央倉庫下載所需的依賴項(即jar包)。這個中央倉庫定義在${M2_HOME}/lib/maven-2.0.10-uber.jar 裏面。你能夠在裏面找到/org/apache/maven/project/pom-4.0.0.xml這個文件,在這個文件裏面定義了中央倉庫的地址: 瀏覽器

<repositories>   
  <repository>   
    <id> central</id>   
    <name> Maven Repository Switchboard</name>   
    <layout> default</layout>   
    <url>http://repo1.maven.org/maven2</url>   
    <snapshots>   
      <enabled> false</enabled>   
    </snapshots>   
  </repository>   
</repositories>



 POM 中配置遠程倉庫

       當某個依賴項存在於第三方的公共倉庫時,咱們須要配置其餘遠程倉庫呢。下面是在pom.xml裏面配置一個遠程倉庫的例子:
安全

<repositories>  
    <repository>
        // 其餘遠程倉庫
    </repository> 
    <repository>   
      <id> maven-net-cn</id>   
      <name> Maven China Mirror</name>   
      <url> http://maven.net.cn/content/groups/public/</url>   
      <releases>   
        <enabled> true</enabled>   
      </releases>   
      <snapshots>   
        <enabled> false</enabled>   
      </snapshots>   
    </repository>   
  </repositories>   
  <pluginRepositories>   
    <pluginRepository>
      // 其餘maven插件倉庫
    </pluginRepository>
    <pluginRepository>   
      <id> maven-net-cn</id>   
      <name> Maven China Mirror</name>   
      <url> http://maven.net.cn/content/groups/public/</url>   
      <releases>   
        <enabled> true</enabled>   
      </releases>   
      <snapshots>   
        <enabled> false</enabled>   
      </snapshots>        
    </pluginRepository>   
  </pluginRepositories>

    這裏咱們能夠看到,容許配置多個repository和 plugin repository,其中<releases><enabled>true</enabled></releases>告訴Maven能夠從這個倉庫下載releases版本的構件,而<snapshots><enabled>false</enabled></snapshots>告訴Maven不要從這個倉庫下載snapshot版本的構件。 服務器


Maven在使用第三方構件和插件時是分開來配置的,因此若是咱們也但願插件的下載也經過咱們的本地倉庫來下載,那麼咱們就須要配置pluginRepository.


之因此不容許從某些倉庫下載snapshot版本,是由於snapshot版本不穩定,可是某些snapshot版本,好比公司內部正在開發的項目, 是必須的


至於<pluginRepositories>,這是配置Maven從什麼地方下載插件構件,Maven的全部行爲都是經過插件來完成的。 <pluginRepository>的配置與<repository>相似,這裏就很少說了。     

  settings.xml 中配置遠程倉庫

     pom.xml的做用範圍限於一個項目, 但一個公司/組織一般不僅開發一個項目,那麼爲了不重複配置,那麼咱們能夠把一些公共配置放在${MAVEN_HOME}/conf/setting.xml(或${user.home}/.m2/setting.xml中。下面是在setting.xml中配置一個遠程倉庫的例子.

<settings>   
  <profiles> 
    <profile>
       <!-- 其餘profile -->
    </profile>
    <profile>   
      <id>myProfiel</id>   
      <!--  在這裏加入<repositories>及<pluginRepositories>  --> 
    </profile>   
  </profiles>   
   
  <!-- 聲明哪些profile被激活,或根據某些條件激活 --> 
  <activeProfiles>   
    <activeProfile>myProfiel</activeProfile>   
  </activeProfiles>   
  
</settings>


     這裏經過<activeProfile>元素來激活這個profile,這樣咱們就能夠全局的使用這個配置,再也不須要爲每一個POM作重複的配置了(也能夠針對特定的條件激活,好比某些profile只有在使用JDK 1.4時才生效)。

     在實際的操做過程當中,setting.xml最好不要配置遠程倉庫,最好可以經過nexus創建公司或者組織本身的倉庫,而後把地址指向本身的倉庫,後面我會介紹爲何要這麼作以及怎麼作。 

配置maven倉庫鏡像

    當你鏈接中央倉庫時速度很慢,或有些國外的第三方倉庫沒法被訪問時,你能夠在setting.xml中爲這些倉庫指定一個鏡像來加快下載依賴項的速度。下面是一個配置鏡像的例子

<settings>   
  ...  
  <mirrors>   
     <mirror>   
      <!-- 其餘鏡像庫 -->
    </mirror>
    <mirror>   
      <id> maven-net-cn</id>   
      <name> Maven China Mirror</name>   
      <url> http://maven.net.cn/content/groups/public/</url>   
      <mirrorOf>central</mirrorOf>   
    </mirror>   
  </mirrors>   
   ...
</settings>
這裏的 <mirrorOf>必須指定某個<repository>的Id. 若是想爲全部的倉庫作鏡像, 那麼能夠改成:<mirrorOf>*</mirrorOf>


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

Nexus簡介

    Nexus是一個Maven倉庫管理器,用來搭建私有倉庫服務器。創建公司/組織的私有倉庫的的好處是便於管理,節省公網帶寬,利用內網下載依賴項速度快,還有一個很是有用的功能就是能有效管理內部項目的SNAPSHOT版本,實現各個模塊間的共享.

安裝 Nexus

    能夠從http://nexus.sonatype.org/downloads/ 獲取最新版本的nexus,本文以1.3.4爲例進行說明。

    Nexus提供了兩種安裝方式,內嵌Jetty的捆綁包(bundle)和WAR包。前者解壓後便可單獨運行,只要系統中安裝了JRE, 後者須要一個Servlet容器來運行.

使用捆綁包安裝

    若是你使用Windows,那麼下載nexus-webapp-1.3. 4-bundle.zip,並將其解壓至任意目錄,如D:/tools,而後轉到D:\tools\nexus-webapp-1.3.4\bin\jsw\indows-x86-32 ,雙擊運行Nexus.bat。 若是你是在linux下安裝,那麼就下載nexus-webapp-1.3. 4 -bundle.tar.gz,解壓後運行nexus.sh。nexus還支持solaris,macos等操做系統。
    當你在控制檯看到「Started SelectChannelConnector@0.0.0.0:8081」以後,說明Nexus啓動成功了。 打開瀏覽器,訪問http://127.0.0.1:8081/nexus,使用管理員的賬號(admin)和密碼(admin123)登陸, 會看到以下的頁面:

在這裏能夠進行管理倉庫,配置Nexus系統,管理任務,管理用戶,角色,權限,查看系統的RSS源,管理及查看系統日誌等操做。

 使用War安裝

     下載WAR包,而後將其發佈到servlet容器中便可 

      到此咱們已經安裝好Nexus,下面介紹一下Nexus經常使用的功能和使用方法。

配置中央倉庫

     在左邊菜單欄裏選擇Repositories, 會看到以下的界面:

其中右邊欄上半部分列出當前nexus管理的repository,黑體字是類型爲group的repository. 這裏簡單介紹下幾種repository的類型:

  • hosted,本地倉庫。一般咱們會部署本身的構件到這一類型的倉庫。好比公司/組織開發的項目
  • proxy,代理倉庫,它們被用來代理遠程的公共倉庫,如maven中央倉庫或一些第三方公共倉庫。
  • group,倉庫組,用來合併多個hosted/proxy倉庫,當你的項目但願在多個repository使用依賴項時,無需引用多個倉庫了,只須要引用一個類型爲group的repository便可。

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

這裏有幾個配置項是常常用到的:

  • Override local storage location:  該選項容許配置 Nexus本地倉庫的存放地址,用來覆蓋其默認的存放地址
  • Remote storage location: 該選項容許配置遠程倉庫的地址。通常爲了提升代理速度,你能夠將其修改成國內的鏡像地址。默認值是http://repo1.maven.org/maven2/
  • Download remote indexes: 該選項配置是否下載遠程索引文件。 建議配置爲true,這樣咱們即可以經過nexus的搜索功能來搜索咱們須要的依賴項。


 添加代理倉庫(proxy)

     nexus默認提供了Maven central這個代理倉庫,若是你須要添加其餘代理倉庫,那麼能夠點擊左邊欄頁面上的Repositories連接,而後在右邊欄頁面上依次點擊add -> add proxy repository, 隨後出現如下頁面:

     根據提示填寫相關信息保存便可。
    

管理本地倉庫(hosted)

    Nexus預約義了三種本地倉庫,分別是Releases, Snapshots, 3rd Party. 下面分別介紹一下這三種類型倉庫的做用

  • Releases:  存放穩定版本的構件。好比咱們完成了一個版本的下數組件的開發,就能夠把它發佈到這裏。
  • Snapshots: 存放快照版本的構件。 好比一個下數組件在完成全部開發和測試工做以前,是不該該發佈到release倉庫的,但可能其餘項目只需用到這個組件的某些接口,只要這些接口完成了開發並經過測試,就能夠拿來使用, 從而實現多個項目並行開發。
  • 3rd Party:  存放其餘第三方構件。你可能會問, 不是有中央倉庫和其餘第三方公共倉庫來管理這些依賴項了嗎?沒錯。但因爲某些開源項目出現的時間比maven要早,所以他們大都沒有采用maven方式進行構建。 其餘還包括包括一些非開源或使用maven 1.x構建的組件. 咱們能夠把這類組件統統添加到這裏。

    建立本地倉庫的方法很簡單。點擊Repository面板上方的Add按鈕,而後選擇Hosted Repository,而後在下方的配置面板中輸入相關信息。 注意根據本身的須要選擇本地倉庫的類型


 倉庫組(group)

      經過前面介紹咱們瞭解到, 能夠創建多個代理倉庫和本地倉庫. 但若是沒有倉庫組的概念,那麼當須要引用這些倉庫時, 就須要將他們逐個添加到pom.xml或setting.xml. 倉庫組是爲了簡化倉庫的引用而提出的。有了倉庫組的概念, 咱們能夠把倉庫根據不一樣目的進行分組,好比把經常使用的歸到一組或根據訪問權限分組, 而後直接聲明引用某個倉庫組便可. 下面是pom.xml中聲明引用一個nexus倉庫組的例子:  

<repositories>
     <repository>
        <id>nexus-public</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>

 能夠看到聲明引用一個倉庫組和一個普通的遠程倉庫,配置的寫法徹底同樣。

maven自己沒有倉庫組的概念

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

public repository默認包含本地倉庫的Releases, snapshots和3rd party以及代理倉庫的Maven Central. 你能夠在Configuration配置頁添加其餘倉庫到這個倉庫組。 若是須要,你還能夠建立一個倉庫組,方法是點擊 Add->Repository Group, 當New Repository Group界面後,填入ID, name 等相關信息, 而後在右邊Available Repositories 欄裏能夠選擇你要添加的倉庫到你新建的倉庫組. 

  

經過 Nexus 搜索構件

      在開發過程當中過程當中,咱們每每只記得某個構件的大體名字,這時咱們能夠經過nexus提供的構件搜索功能查詢該構件的完整配置信息(groupId,artifactId,version).若是經過nexus搜不到某個的構件,那說明這個構件不在當前nexus所登記的倉庫中,可能須要添加額外的代理倉庫或手工上傳某個構件。

     在使用nexus的搜索功能以前,必須先讓nexus所登記的倉庫創建索引文件, Nexus默認是不爲每一個倉庫創建索引文件的,由於創建像中央倉庫這樣的索引文件須要耗費比較大的網絡帶寬和事件,僅索引文件就要幾十兆. 要開啓中央倉庫的索引文件下載功能須要在Maven Central的配置頁中, 把Download Remote Indexes改成true. 如圖:

     這樣設置以後, Nexus會自動從遠程中央倉庫下載索引文件, 爲了檢驗索引文件自動下載是否生效,能夠切換到Browse標籤頁,如圖:

若是出現相似於以上文件夾,那說明索引文件已經創建成功.

    下面咱們試一下搜索功能,  搜索欄輸入testing, 查詢結果以下:

這是模糊查詢的結果,固然若是你知道更多信息,好比版本號等,你可使用高級搜索,點擊高級搜索後,右邊界面會提供集中搜索方式:keyword, classname, GAV, checksum

好比咱們這裏選擇GAV模式. 假設我只知道artifact的名字(如testng)和版本號(如5.8), 其餘的我不知道, 那麼就在artifact 和 version處分別輸入testng 和 5.8 , 搜索結果以下:

若是你不知道知道構件的名稱, 只知道classname, 那麼你也能夠經過class name 的方式搜索,這裏就再也不贅述。

當你選中某項搜索結果, 頁面的下方會出現這個構件的詳細信息, 而且會列出這個構件的Maven依賴配置, 你能夠直接拷貝到你的pom文件中使用,這是個很是實用的功能:

 Maven 中使用Nexus

    到此咱們介紹瞭如何安裝和使用Nexus以及其基本配置, 那麼如何在Maven來使用Nexus本地倉庫呢?其實和配置遠程倉庫的方法同樣。下面是在settings.xml中添加了一個nexus本地倉庫的例子:

<profiles>
   ...
   <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>http://127.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>

你也能夠在pom.xml中聲明引用某個nexus倉庫。

構件部署

     有些時候咱們須要部署構件到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 界面來部署一些缺失的構件。對於本身開發的構件還有另外一種簡單的部署方式, 即經過命令mvn deploy進行部署。但使用這種部署方式須要在pom.xml中添加一些配置,好比:

<project>   
    …   
    <distributionManagement>   
        <repository>   
            <id>nexus-releases</id>   
	     <name>Nexus Release Repository</name>   
	     <url>http://127.0.0.1:8081/nexus/content/repositories/releases/</url>
        </repository>
        <snapshotRepository>
            <id>nexus-snapshots</id>
            <name>Nexus Snapshot Repository</name>
            <url>http://127.0.0.1:8081/nexus/content/repositories/snapshots/</url>
        </snapshotRepository>   
    </distributionManagement>   
    …   
</project>

這裏告訴Maven當我要發佈release版本或者snapshot版本時,把構建好的成品上傳到哪一個服務器地址。

最後還要在setting.xml裏面配置一個有部署權限的Nexus的賬號和密碼

<settings>   
  …   
    <servers>   
      <server>   
        <id> nexus-releases</id>   
    <username>admin</username>   
    <password>admin123</password>   
  </server>   
  <server>   
    <id> nexus-snapshots</id>   
    <username>admin</username>   
    <password>admin123</password>   
  </server>      
</servers>   
…   
</settings>

至此 咱們就能夠經過命令mvn deploy來發布咱們項目到本地倉庫了. 

這裏咱們使用了admin來進行部署,通常建議使用一個具備部署權限的帳號執行部署操做。

 

補充

一、 發現配置了nexus倉庫組以後,下載構件拋異常

0-10-3 下午05時09分43秒: Build error for /com.newyulong.iptv.domain.entity/pom.xml; org.apache.maven.plugin.PluginResolutionException: Plugin org.apache.maven.plugins:maven-resources-plugin:2.4.1 or one of its dependencies could not be resolved: Missing:
----------
1) org.apache.maven.plugins:maven-resources-plugin:maven-plugin:2.4.1

  Try downloading the file manually from the project website.

  Then, install it using the command: 
      mvn install:install-file -DgroupId=org.apache.maven.plugins -DartifactId=maven-resources-plugin -Dversion=2.4.1 -Dpackaging=maven-plugin -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there: 
      mvn deploy:deploy-file -DgroupId=org.apache.maven.plugins -DartifactId=maven-resources-plugin -Dversion=2.4.1 -Dpackaging=maven-plugin -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

----------
1 required artifact is missing.

for artifact: 
  org.apache.maven.plugins:maven-resources-plugin:maven-plugin:2.4.1

from the specified remote repositories:
  Nexus (http://localhost:8181/nexus/content/groups/public , releases=true, snapshots=false)

 這裏的主要緣由是配置nexus裏面的Public Repositories 順序和條件出錯,致使不能下載構件。好比這個public repositories:

這個是正確的配置順序。其中左邊的是正在使用的定義好的倉庫,右邊的是候選的倉庫。在這個例子中,nexus下載構件的順序是Releases -->Snapshots --> 3rd party --> Maven Central。

     好多公司處於安全考慮,要求使用用代理訪問公網,而nexus常常須要往maven repository中心下載東西,所以須要給nexus的倉庫設置代理。   

相關文章
相關標籤/搜索