天天看點

Maven 使用Nexus建立私服

倉庫管理軟體: 

    私服不是maven的核心概念,它僅僅是一種衍生出來的特殊的maven倉庫 

    有三種專門的maven倉庫管理軟體可以用來幫助大家建立私服: 

    apache基金會的archiva、jfrog的artifacotory和sonatype的nexus,archiva是開源的,artifacotory和nexus的核心也是開源的

    nexus分為開源版和專業版,開源版本基本gplv3許可證,其特性足以滿足大部分maven使用者的需要,特性如下: 

    較小的記憶體占用(最少僅為28mb) 

    基于extjs的友好界面 

    基于restlet的完全rest api 

    支援代理倉庫、宿主倉庫和倉庫組 

    基于檔案系統、不需要資料庫 

    支援倉庫索引和搜尋 

    支援從界面上傳maven構件 

    細粒度的安全控制

    nexus專業版本是需要付費購買的,對開源版本多如下特性: 

    一些專業安全控制 

    釋出流程控制等需要的特性

安裝nexus 

    nexus是典型的javaweb應用,它有兩種安裝包:包含jetty容器的bundle包,不包含web容器的war包 

    解壓後直接運作即可

    解決壓包含如下兩個目錄: 

    nexus-webapp-xxx:該目錄包含了nexus運作所需要的檔案,如啟動腳本、依賴jar包等 

    sonatype-work:該目錄包含nexus生成的配置檔案、日志檔案、倉庫檔案等

    其中,第一個目錄是運作nexus所必需的,而且所有相同版本的nexus執行個體所包含的該目錄内容都是一樣的。 

    第二個目錄不是必須的,是在運作的時候動态建立的 

    是以需要備份nexus的時候,預設備份sonatype-work目錄就可以。

    在linux下面安裝 

    warning - not recommended to run as root 

    **************************************** 

    if you insist running as root, then set the environment variable run_as_user=root before running this script

    在172.168.27.70伺服器上操作 

    root使用者操作(建立maven使用者并賦權限) 

    groupadd -g 1000 maven 

    useradd -d /opt/maven/ -g 1000 maven 

    chown -r maven:maven /opt/maven 

    passwd maven 

    su - maven 

    上傳至/opt/maven目錄 

    unzip nexus-2.3.0-04-bundle.zip 

    ln -s nexus-2.3.0-04 nexus 

    cd nexus/bin 

    ./nexus start

    設定環境變量 

    vi .bashrc 

    增加如下内容: 

    export nexus_home=/opt/maven/nexus-2.3.0-04 

    export path=$path:$nexus_home/bin

    即可在任何目錄運作nexus指令,如 

    nexus start

    usage: /opt/maven/nexus-2.3.0-04/bin/nexus { console | start | stop | restart | status | dump }

    用admin賬号登入nexus(建議采用firefox登入,展示效果較好,在其他浏覽器相容器不好) 

    admin/admin123 

    deployment/deployment123

添加如下遠端倉庫: 

<a href="http://repository.jboss.org/maven2/">http://repository.jboss.org/maven2/</a> <a href="https://repository.sonatype.org/content/groups/forge/">https://repository.sonatype.org/content/groups/forge/</a>     alibaba  <a href="http://code.alibabatech.com/mvn/releases/">http://code.alibabatech.com/mvn/releases</a>  cloudera  <a href="https://repository.cloudera.com/artifactory/cloudera-repos">https://repository.cloudera.com/artifactory/cloudera-repos</a> <a href="http://mvnrepo.code.taobao.org/nexus/content/repositories/releases/">http://mvnrepo.code.taobao.org/nexus/content/repositories/releases/</a> <a href="http://172.168.27.70:8081/nexus/index.html#welcome">http://172.168.27.70:8081/nexus/index.html#welcome</a>

    配置時勾選:download remote indexes,這樣nexus自動啟動定時任務scheduled tasks下載下傳索引 

    預設central是沒有勾選download remote indexes,可以修改central的配置,下載下傳中央倉庫的索引 

    并在倉庫組 public repositories中按以下順序增加以上4個遠端倉庫 

    sonatype forge、apache releases、jboss releases、java net

登入nexus 

    nexus的預設管理者使用者名和密碼為admin/catt2013

nexus的倉庫和倉庫組 

    倉庫有4種類型 

    group(倉庫組)、hosted(宿主)、proxy(代理)、virtual(虛拟) 

    虛拟類型倉庫的作用實際上是動态地将倉庫内容格式轉換,即也是為了服務maven1格式

    nexus内置的倉庫 

    maven central: 代理maven中央倉庫 

    releases: 一個政策為release的宿主類型倉庫,用來部署組織内部的釋出版本構件 

    snapshots: 一個政策為snapshot的宿主類型倉庫,用來部署組織内部的快照版本構件 

    3rd party: 一個政策為release的宿主類型倉庫,用來部署無法從公共倉庫獲得的第三方釋出版本構件 

    apache snapshots: 一個政策為snapshot的代理倉庫,用來代理apache maven倉庫的快照版本構件 

    codehaus snapshots: 一個政策為snapshot的代理倉庫,用來代理codehaus maven倉庫的快照版本構件 

    google code: 一個政策為release的代理倉庫,用來代理google code maven倉庫的釋出版本構件 

    java.net - maven 2:一個政策為release的代理倉庫,用來代理java.net maven倉庫的釋出版本構件 

    public repositories:該倉庫組将上述所有政策為release的倉庫聚合并通過一緻的位址提供服務 

    public snapshot repositories:該倉庫組将上述所有政策為snapshot的倉庫聚合并通過一緻的位址提供服務

    倉庫分類的概念 

    maven可以直接從宿主倉庫下載下傳構件;也可以從代理倉庫下載下傳構件, 

    而代理倉庫會間接地從遠端倉庫下載下傳并緩存構件;最後,為了友善,可以從 

    倉庫組下載下傳構件,而倉庫組沒有實際内容(圖中用虛線表示),它會轉向其包含 

    的宿主倉庫或代理倉庫獲得實際構件的内容

nexus的索引與構件搜尋 

    nexus通過維護倉庫的索引來提供搜尋功能,能在很大程度上友善maven使用者定位構件坐标

    為了能夠搜尋maven中央倉庫,首先需要設定nexus中的maven central代理倉庫下載下傳遠端索引,需要注意的是: 

    這上配置的值預設是關閉的,此外,由于中央倉庫的内容比較多,是以其索引檔案比較大,nexus下載下傳該檔案也需要比較 

    長的時間。

    提供的搜尋方式如下: 

    關鍵字搜尋: 

    gav搜尋:允許使用者通過設定groupid、artifactid、version等資訊來進行更有針對性的搜尋 

    類名搜尋:允許使用者搜尋包含某個java類的構件 

    校驗搜尋:(checksum search) 允許使用者使用構件的校驗(如通過spring-core-3.0.6.release.jar.sha1的内容)進行搜尋

    有了中央倉庫的索引,使用者不僅能夠搜尋構件,還能夠直接浏覽中央倉庫的内容。即nexus的索引浏覽功能。在repositories頁面中, 

    選擇browse index頁籤,就能看到中央倉庫内容的樹形結構。

    以上的索引及浏覽功能都是基于nexus索引而實作的,确切的應該稱之為nexus-indexer 

    nexus能夠周遊一個maven倉庫所有的内容,搜集它們的坐标、校驗和所含的java類資訊,然後以nexus-indexer的形式儲存起來。 

    中央倉庫維護了這樣的一個nexus-indexer,是以本地的nexus下載下傳到這個索引之後,就能在此基礎上提供搜尋和浏覽等服務。

    注意:不是任何一個公共倉庫都提供nexus-indexer,對于那些不提供索引的倉庫來說,無法對其進行搜尋。

配置maven從nexus下載下傳構件 

    在pom中為maven配置倉庫和插件倉庫,這樣的配置隻對目前maven項目有效,在實際應用中,需要在settings.xml中配置。 

    這樣對所有本機maven項目有效。但是settings。xml并不支援直接配置repositories和pluginrepositories, 

    可以通過profile機制進行配置

    &lt;profiles&gt; 

        &lt;profile&gt; 

            &lt;id&gt;nexus&lt;/id&gt; 

            &lt;repositories&gt; 

                &lt;repository&gt; 

                    &lt;id&gt;nexus&lt;/id&gt; 

                    &lt;name&gt;nexus repository&lt;/name&gt; 

                    &lt;releases&gt; 

                        &lt;enabled&gt;true&lt;/enabled&gt; 

                    &lt;/releases&gt; 

                    &lt;snapshots&gt; 

                    &lt;/snapshots&gt; 

                &lt;/repository&gt; 

            &lt;/repositories&gt; 

            &lt;pluginrepositories&gt; 

                &lt;pluginrepository&gt; 

                &lt;/pluginrepository&gt; 

            &lt;/pluginrepositories&gt; 

        &lt;/profile&gt; 

    &lt;/profiles&gt; 

    &lt;activeprofiles&gt; 

        &lt;activeprofile&gt;nexus&lt;/activeprofile&gt; 

    &lt;/activeprofiles&gt; 

    這樣的配置已經能讓本機所有的maven項目從nexus私服下載下傳構件,但還會不時地通路中央倉庫central 

    如果希望所有maven下載下傳請求都通過nexus,以全面發揮私服的作用,就需要配置鏡像。 

    &lt;mirrors&gt; 

        &lt;mirror&gt; 

            &lt;mirrorof&gt;*&lt;/mirrorof&gt; 

        &lt;/mirror&gt; 

      &lt;/mirrors&gt;

部署構件至nexus 

    宿主倉庫的主要作用是存儲組織内部的,或者一些無法從公共倉庫中獲得的第三方構件,供項目項目使用。

    使用者可以配置maven自動部署構件至nexus的宿主倉庫,也可以通過界面手工上傳構件

    使用maven部署構件至nexus(在所在項目的pom.xml中配置) 

    &lt;distributionmanagement&gt; 

        &lt;repository&gt; 

            &lt;id&gt;nexus-releases&lt;/id&gt; 

            &lt;name&gt;nexus releases repository&lt;/name&gt; 

        &lt;/repository&gt; 

        &lt;snapshotrepository&gt; 

            &lt;id&gt;nexus-snapshots&lt;/id&gt; 

            &lt;name&gt;nexus snapshots repository&lt;/name&gt; 

        &lt;/snapshotrepository&gt; 

    &lt;/distributionmanagement&gt;

    nexus的倉庫對于匿名使用者是隻讀的,為了能夠部署構件,需要在settings.xml中配置認證資訊

       &lt;servers&gt; 

         &lt;server&gt; 

        &lt;id&gt;nexus-releases&lt;/id&gt; 

        &lt;username&gt;admin&lt;/username&gt; 

        &lt;password&gt;admin123&lt;/password&gt; 

        &lt;/server&gt; 

        server&gt; 

        &lt;id&gt;nexus-snapshots&lt;/id&gt; 

      &lt;/servers&gt;

    手工部署第三方構件至nexus 

    針對由于許可證的因素無法公共地放在公共倉庫中,還有大量的小型項目,沒有把自己的構件分發到中央倉庫,可以手工下載下傳到本地, 

    然後通過nexus的界面上傳到私服中。

    上傳第三方構件,上傳至3rd party宿主倉庫

nexus的權限管理 

    通路控制模型 

    nexus是基于權限(privilege)做通路控制的,伺服器的每一個資源都有相應的權限來控制。是以使用者執行特定的操作時就必須有必要的權限。

    nexus預定義的三個使用者,這三個使用者對應了三個權限級别: 

    admin/admin123:擁有對nexus服務的完全控制 

    deployment/deployment123:能夠通路nexus,浏覽倉庫内容、搜尋、并且上傳部署構件,但無法對nexus進行任何配置 

    anonymous:對應了所有未登入的匿名使用者,可以浏覽倉庫并進行搜尋。

    為項目配置設定獨立的倉庫 

    為每個項目配置設定獨立的倉庫,并且隻将倉庫的部署、修改、和删除權限賦予該項目成員,其他使用者隻能讀取、下載下傳和搜尋該倉庫的内容。

    有了倉庫之後,就需要建立基于倉庫的增、删、改、查權限,在nexus中,這樣的權限是基于repository target建立的, 

    repository target實際上是一系清單達式,在通路倉庫某路徑下面的内容的時候,nexus會将倉庫路徑與repository target的 

    正規表達式一一比對,以檢查權限是否正确。

    先建立repository target,然後根據repository target建立對應的privileges, 建立包含如上權限的角色, 

    根據需要将其配置設定給項目的團隊成員。

nexus的排程任務 

    nexus提供了一系列可配置的排程任務來友善使用者管理系統。