Nexus Repository 搭建及使用


  Nexus Repository 是搭建maven的鏡像的工具之一,在全球范圍內使用挺廣的。

一、Nexus 搭建過程

  Nexus 鏡像的搭建還是相對簡單的,將下載的文件解壓到相應的目錄下,然后進入./nexus-version/bin/下,啟動nexus即可將Nexus Repository運行起來(其中Nexus是基於Jetty來運行的)。

  啟動起來后,通過瀏覽器訪問http://ip:8081就可以訪問了。界面如下所示:

  其中通過右側的Sign In可以登錄用戶來管理Nexus。對於未登錄的用戶,只能查詢和瀏覽相關資源。用戶登錄后就能看到管理相關的菜單了,在管理菜單中主要是配置Blob Stores和Repositories,其中Blob Stores 是用來配置資源的保存位置的,可以將不同的遠程資源保存到服務器的不同位置上(類似於Nexus 2的遠程資源保存路徑配置,在Nexus 3中進行了分組管理),Repositories 則用來配置遠程資源和本地資源,其中支持Proxy類型資源,表示遠程資源的鏡像,host類型的資源表示本地資源,用於保存第三方資源或團隊內部共享的資源等。group類型資源是組,可以將多個proxy或host類型的資源構建成一個組,供Maven使用等,如下圖所示:

注意事項:

1.  Nexus 2 能夠支持資源信息的拷貝,提供xml格式,而Nexus 3 暫時還不支持該xml格式拷貝。

2.  Nexus 2 能夠下載遠程的索引到本地,供搜索查詢使用,但是Nexus 3 暫時還不支持,在Nexus 3 中查詢的都是已經有請求該鏡像庫的資源,對於未從該鏡像庫下載過的資源是無法查詢到的。那么在Nexus 3 搭建初期,沒有使用前,在該系統是查詢不到任何資源的,需要先使用程序去調用該鏡像,才會有資源使用。

3.  Nexus 3 暫時不支持下載遠程鏡像的索引。只有當Maven中設置了Nexus 3 的資源庫,Nexus 3 會在具體編譯項目的時候先從遠程下載對應的資源到本地,然后傳輸給各個客戶端使用。 這樣也就不用跟Nexus 2 中那樣再【Repair Index】來更新索引了。

 

二、Maven 配置Nexus 鏡像

   Nexus 鏡像搭建起來后,那么如何在Maven中使用該鏡像資源呢? 主要是通過調整maven配置來識別該鏡像資源,從而將maven資源請求轉發到該鏡像資源庫上。通常的做法為在當前用戶的目錄下.m2文件夾中創建settings.xml文件,其中指定mirror,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!-- for full reference, see also http://maven.apache.org/ref/3.2.3/maven-settings/settings.html -->
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

   <!-- 使用Mirror配置節可以強制所有包請求都會被轉向內網Nexus服務器的地址 -->
  <mirrors>
      <mirror>
      <id>mirror_name</id>
      <mirrorOf>*</mirrorOf>
      <url>http://nexus_ip:8081/repository/maven-public/</url>
    </mirror>
  </mirrors>
</settings>

  上述配置信息是所有的遠程資源鏡像的訪問都會通過該鏡像來訪問,這也是大部分公司采用的方案,因為這樣能夠保證公司對遠程資源的訪問次數是有限的,公司內部的開發人員訪問的都是公司內部的資源。開發人員不需要鏈接外網去下載遠程鏡像服務器上的資源,只需要該公司內部鏡像去訪問一次即可。當然了,mirrorOf可以指定為代理部分遠程資源,詳情見官方說明:http://maven.apache.org/guides/mini/guide-mirror-settings.html

 三、Nexus 啟用上傳功能

  團隊有了私有的鏡像服務器以后,團隊內部代碼的依賴也就不再需要源碼依賴了,大家可以通過發布不同版本的jar到nexus鏡像上來供調用者直接通過Maven下載使用,這樣不同研發人員直接的依賴也就沒有那么強了,大家可以基於已經發布的版本進行各自的開發。

  那么如何發布個人的jar資源到團隊內部鏡像上呢? 

  1. 在Nexus 中創建一個developer的角色,擁有的權利為【nx-repository-view-maven2-*-edit】和【nx-repository-view-maven2-*-add】權利,如果該角色將來可能還有nuget,npm相關上傳權利,則將其權利改為【nx-repository-view-*-*-edit】和【nx-repository-view-*-*-add】權利。

  2. 創建用戶,用戶擁有的角色為【nx-anonymous】和剛創建的【developer】角色。其中nx-anonymous角色是nexus默認自帶的角色。

  3. 在.m2文件夾下的settings.xml配置文件中增加<servers>的配置。

<?xml version="1.0" encoding="UTF-8"?>
<!-- for full reference, see also http://maven.apache.org/ref/3.2.3/maven-settings/settings.html -->
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

    <!-- 配置Maven服務器的賬號信息,自動化部署的時候需要用到 -->
  <servers>
    <server>
      <id>server_id</id>
      <!-- 使用公共的developer/password賬號進行日常的發布管理 -->
      <username>developer</username>
      <password>password</password>
    </server>
  </servers>

   <!-- 使用Mirror配置節可以強制所有包請求都會被轉向內網Nexus服務器的地址 -->
  <mirrors>
      <mirror>
      <id>mirror_name</id>
      <mirrorOf>*</mirrorOf>
      <url>http://nexus_ip:8081/repository/maven-public/</url>
    </mirror>
  </mirrors>
</settings>

  4.  在需要上傳jar資源的項目的pom.xml中增加<distributionManagement>配置,其中<id>設置需要跟.m2文件夾下的settings.xml中<servers>下的id相同。<url>需要指定nexus中配置的hosts Repository資源的地址。

    <distributionManagement>
        <repository>
            <id>server_id</id>
            <name>Nexus Release Repository</name>
            <url>http://nexus_ip:8081/repository/host-releases/</url>
        </repository>
    </distributionManagement>

  5.  通過maven 編譯項目,並通過mvn deploy 來發布jar資源到團隊內部的鏡像服務器即可。

 

 四、Nexus 啟用SNAPSHOTS

  團隊內部在開發過程中為了相互可以互不影響的開發,需要時常將未穩定版的jar發布出來供團隊其他人員調用,這時候建議使用SNAPSHOT版本,那么SNAPSHOT版本怎么發布到Nexus上呢。如果以當前的配置,發布SNAPSHOT過程會失敗,因為Nexus默認是不啟用SNAPSHOT的。那么怎么啟用SNAPSHOT及如何上傳SNAPSHOT版本資源呢?

  啟用SNAPSHOT的方式為在.m2文件夾下的settings.xml中增加<profile>設置

 <!-- 這個默認配置決定了我們的Maven服務器開啟snapshot配置,否則不能下載SNAPSHOTS的相關資源 --> 
 <profiles>
    <profile>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <id>repository_name</id>
          <name>Nexus Public Repository</name>
          <url>http://nexus_ip:8081/repository/maven-public/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </repository>
      </repositories>
    </profile>
  </profiles>

    增加這個配置后,那么是否就可以直接上傳SNAPSHOT版本的jar資源了呢?經過測試還是不行,還需要有其他配置。

  1.  Nexus Repository中增加一個hosted類型的Repository,Maven的資源類型為SNAPSHOT(Nexus默認已經存在一個這種類型的資源)。

  2.  settings.xml的<servers>增加snapshot server的配置,settings.xml的最終配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- for full reference, see also http://maven.apache.org/ref/3.2.3/maven-settings/settings.html -->
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <!-- 配置Maven服務器的賬號信息,自動化部署的時候需要用到 -->
  <servers>
   <server>
      <id>nexus-releases</id>
      <!-- 使用公共的developer/password賬號進行日常的發布管理 -->
      <username>developer</username>
      <password>password</password>
    </server>
    <server>
      <id>nexus-snapshots</id>
      <!-- 使用公共的developer/password賬號進行日常的發布管理 -->
      <username>developer</username>
      <password>password</password>
    </server>
  </servers>

  <!-- 使用Mirror配置節可以強制所有包請求都會被轉向內網Nexus服務器的地址 -->
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <url>http://nexus_ip:8081/repository/maven-public/</url>
    </mirror>
  </mirrors>

  <!-- 這個默認配置決定了我們的Maven服務器開啟snapshot配置,否則不能下載SNAPSHOTS的相關資源 --> 
 <profiles>
    <profile>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <repositories>
        <repository>
          <id>repository_name</id>
          <name>Nexus Public Repository</name>
          <url>http://nexus_ip:8081/repository/maven-public/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
          </snapshots>
        </repository>
      </repositories>
    </profile>
  </profiles>
</settings>

  3. 需要發布jar資源到團隊內部鏡像服務器的項目的pom.xml配置<distributionManagement>增加snapshot的支持,最終的pom.xml增加的<distributionManagement>如下:

    <distributionManagement>
        <repository>
            <id>nexus-releases</id>
            <name>Nexus Release Repository</name>
            <url>http://nexus_ip:8081/repository/yoyi-releases/</url>
        </repository>
        <snapshotRepository>
            <id>nexus-snapshots</id>
            <name>Nexus Snapshot Repository</name>
            <url>http://nexus_ip:8081/repository/yoyi-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

  

  通過上述各種配置,即可以發布jar到團隊內部的鏡像服務器了。 其中distributionManagement需要配置在各個項目的pom.xml文件中,如果多個項目都需要使用,是否可以將<distributionManagement>放到.m2文件夾下的settings.xml中呢?經過測試,放到settings.xml中是不起作用的。那么如果在多個項目中使用的方案為多個項目創建一個父項目,將各個項目作為模塊加載到父項目中,只在父項目中配置distributionManagement即可。如果各位看客有更好的方案,還望能在留言中告知下。^-^

  五、異常情況處理

*UNKNOWN com.sonatype.nexus.plugins.outreach.internal.outreach.SonatypeOutreach - Could not download page bundle
org.apache.http.conn.HttpHostConnectException: Connect to sonatype-download.global.ssl.fastly.net:443 [sonatype-download.global.ssl.fastly.net/69.171.245.49] failed: 連接超時
    at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:151) [httpcore:0.0.0]
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:353) [httpcore:0.0.0]
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:380) [httpcore:0.0.0]
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236) [httpcore:0.0.0]
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184) [httpcore:0.0.0]
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88) [httpcore:0.0.0]

  處理方法:登錄賬號,打開【System】--》【Capabilities】,將【Outreach:Management】禁用即可。


免責聲明!

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



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