Nexus Repository 是搭建maven的鏡像的工具之一,在全球範圍內使用挺廣的。html
1、Nexus 搭建過程java
Nexus 鏡像的搭建仍是相對簡單的,將下載的文件解壓到相應的目錄下,而後進入./nexus-version/bin/下,啓動nexus便可將Nexus Repository運行起來(其中Nexus是基於Jetty來運行的)。apache
啓動起來後,經過瀏覽器訪問http://ip:8081就能夠訪問了。界面以下所示:npm
其中經過右側的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格式拷貝。maven
2. Nexus 2 可以下載遠程的索引到本地,供搜索查詢使用,可是Nexus 3 暫時還不支持,在Nexus 3 中查詢的都是已經有請求該鏡像庫的資源,對於未從該鏡像庫下載過的資源是沒法查詢到的。那麼在Nexus 3 搭建初期,沒有使用前,在該系統是查詢不到任何資源的,須要先使用程序去調用該鏡像,纔會有資源使用。ide
3. Nexus 3 暫時不支持下載遠程鏡像的索引。只有當Maven中設置了Nexus 3 的資源庫,Nexus 3 會在具體編譯項目的時候先從遠程下載對應的資源到本地,而後傳輸給各個客戶端使用。 這樣也就不用跟Nexus 2 中那樣再【Repair Index】來更新索引了。工具
2、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】禁用便可。