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】禁用即可。