Nexus是一個強大的Maven倉庫管理器,它極大地簡化了自己內部倉庫的維護和外部倉庫的訪問。利用Nexus你可以只在一個地方就能夠完全控制訪問和部署在你所維護倉庫中的每個Artifact。Nexus是一套“開箱即用”的系統不需要數據庫,它使用文件系統加Lucene來組織數據。Nexus 使用ExtJS來開發界面,利用Restlet來提供完整的REST APIs,通過m2eclipse與Eclipse集成使用。Nexus支持WebDAV與LDAP安全身份認證。
來自<http://www.oschina.net/p/nexus>
安裝Nexus
下載
Nexus有兩種安裝包,一種是包含Jetty容器的Bundle包,另一種是不包含Web容器的war包。我們可以從http://www.sonatype.org/downloads/nexus-latest-bundle.zip下載最新版本的Nexus的Bundle包。
解壓nexus-latest-bundle.zip,會發現有兩個文件夾。如圖1:
圖1
nexus-2.7.2-03目錄包含了Nexus運行所需要的文件。是Nexus運行必須的。
sonatype-work目錄包含Nexus生成的配置文件、日志文件、倉庫文件等。當我們需要備份Nexus的時候默認備份此目錄即可。
安裝
進入目錄nexus-2.7.2-03\bin\jsw,你會發現有很多的安裝環境。我的操作系統是64位的Windows 8,那么進入windows-x86-64目錄。有以下文件,如圖2:
圖2
install-nexus.bat:將Nexus服務安裝到Windows系統。
start-nexus.bat:啟動Nexus服務。
stop-nexus.bat:停止Nexus服務。
uninstall-nexus.bat:卸載Nexus服務。
右擊install-nexus.bat“以管理員身份運行”運行文件,右擊start-nexus.bat“以管理員身份運行”運行文件。在“服務”中,我們可以看到Nexus已經安裝並且運行起來了,圖3:
圖3
安裝之前要先安裝JDK,並在環境變量中配置JAVA_HOME和PATH。
登錄
在瀏覽器中輸入:http://localhost:8081/nexus/得到以下界面,見圖4:
圖4
單擊右上角的“Log In”按鈕進行登錄,Nexus的默認管理員賬戶密碼為admin/admin123。
配置Nexus
Nexus倉庫分類
Nexus包含了各種類型的倉庫類型。在登錄后的Nexus界面,單擊左邊的“Repositories”鏈接,可以看到圖5所示:
圖5
我們可以從上圖中看到四種倉庫類型:group(倉庫組)、hosted(宿主)、proxy(代理)和virtual(虛擬)。其中每種類型的Format有Maven1或者Maven2,這里我們不看Maven1的。倉庫的Policy(策略)表示該倉庫為發布(Release)版本還是快照(Snapshot)版本倉庫。
在圖5中,Nexus列出了默認的幾個倉庫:
Public Repositories:倉庫組,將所有策略為Release的倉庫聚合並通過一致的地址提供服務。
3rd party:一個策略為Release的宿主類型倉庫,用來部署無法從公共倉庫獲得的第三方發布版本構件。
Apache Snapshots:策略為Snapshots的代理倉庫,用來代理Apache Maven倉庫的快照版本構件。
Central:該倉庫代理Maven的中央倉庫,策略為Release,只會下載和緩存中央倉庫中的發布版本構件。
Central M1 shadow:maven1格式的虛擬類型倉庫。
Codehaus Snapshots:代理Codehaus Maven倉庫快照版本的代理倉庫。
Release:策略為Release的宿主類型倉庫,用來部署組織內部的發布版本構件。
Snapshots:策略為Snapshots的宿主類型倉庫,用來部署組織內部的快照版本構件。
用《Maven實戰》中一張圖來解釋下倉庫的分類:
圖6
私有倉庫配置
Nexus的索引與構件搜索
點擊圖5中列表上的“Public Repositories”行,在下方的“Configuration”中我們可以看到,在“Ordered Group Repositories”中包含了Release、Snapshots、3rd party、Central等倉庫。
為了構建Nexus的Maven中央庫索引,首先需要設置Nexus中Maven Cencal代理倉庫下載遠程索引,將“Download Remote Indexes”的值從默認值false改為true。如圖7:
圖7
點擊“Save”后,點擊左邊的“Scheduled Tasks”鏈接,會出現圖8界面,說明Nexus后台在下載Maven中央倉庫的索引。
圖8
如果沒有出現圖8界面,那么要在“Public Repositories”行右擊,點擊“Update Index”。
圖9
在“Repositories”界面中,選擇Browse Index選項卡,可以看到Maven中央倉庫內容的樹形結構,如圖10。
圖10
如果還是構建不成功,參考:http://blog.csdn.net/mtkong/article/details/9377605
http://397013586.iteye.com/blog/1558492
在左邊的搜索框中輸入“spring”關鍵字,會出現一大堆與spring相關的結果。
如果要對宿主倉庫和代理倉庫建立索引。只需要在對應的倉庫上右擊,從彈出的快捷菜單中選擇“ReIndex”即可。
配置Maven從Nexus下載構件
在上面的基礎上,我們可以用Nexus私服了。有2種方式:
1、在項目的POM中配置。
<repositories>
<repository>
<id>local_nexus</id>
<name>local_nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>local_nexus</id>
<name>local_nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
這樣的配置只對當前的Maven項目有效。但是,實際的項目開發中,我們都想着一次配置就能讓本機的所有Maven項目都使用Maven私服,那么我們就要用到下面的方法。
2、在settings.xml中配置遠程倉庫。
Maven提供的profile是一組可選的配置,可以用來設置或者覆蓋配置默認值。有了profile,你就可以為不同的環境定制構建。那么在settings.xml中加入以下代碼:
<settings>
...
<profiles>
<profile>
<id>local_nexus</id>
<repositories>
<repository>
<id>local_nexus</id>
<name>local_nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>local_nexus</id>
<name>local_nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>local_nexus</activeProfile>
</activeProfiles>
...
</settings>
上面的配置中,使用了一個id為local_nexus的profile,這個profile包含了相關的倉庫配置,同時配置中又使用了activeProfiles元素將nexus這個profile激活,這樣當執行Maven構建的時候,激活的profile會將倉庫配置應用到項目中去。
通過上面的配置,我們會發現Maven除了從Nexus下載構件外還會從中央倉庫下載構件構件。既然是私服,那么我們就只希望Maven下載請求都僅僅通過Nexus。我們可以通過鏡像實現這一需求。可以創建一個匹配任何倉庫的鏡像,鏡像的地址是私服,這樣Maven對任何倉庫的構件下載請求都會轉到私服中。把上面的配置修改為如下配置:
<settings>
...
<mirrors>
<mirror>
<id>local_mirror</id>
<mirrorOf>*</mirrorOf>
<name>local_mirror</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>local_nexus</id>
<repositories>
<repository>
<id>local_nexus</id>
<name>local_nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>central</id>
<!--由於配置過鏡像,這個url不起作用-->
<url>http://repo.maven.apache.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>local_nexus</id>
<name>local_nexus</name>
<url>http://localhost:8081/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>central</id>
<url>http://repo.maven.apache.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>local_nexus</activeProfile>
</activeProfiles>
...
</settings>
部署構件到私服
我們在實際開發過程是多個人的,那么總有一些公共模塊或者說第三方構件是無法從Maven中央庫下載的。我們需要將這些構件部署到私服上,供其他開發人員下載。用戶可以配置Maven自動部署構件至Nexus的宿主倉庫,也可以通過界面手動上傳構件。
使用Maven部署構件到Nexus私服上
日常開發的快照版本部署到Nexus中策略為Snapshot的宿主倉庫中,正式項目部署到策略為Release的宿主倉庫中,POM的配置方式如下:
...
<distributionManagement>
<repository>
<id>local_nexus_releases</id>
<name>core Release Repository</name>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>local_nexus_snapshots</id>
<name>core Snapshots Repository</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
...
Nexus的倉庫對於匿名用戶只是只讀的。為了能夠部署構件,我們還需要再settings.xml中配置驗證信息:
...
<servers>
<server>
<id>local_nexus_releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>local_nexus_snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
...
其中,驗證信息中service的id應該與POM中repository的id一致。
在Nexus界面上手動部署第三方構件至私服
我們除了自己的構件要部署到Nexus私服上外,我們有可能還要將第三方構件(如:SQLService的JDBC)部署到Nexus上。這個時候,在Nexus界面上選擇一個宿主倉庫(如3rd party),再在頁面下方選擇Artifact Upload選項卡。填寫對應的Maven坐標。然后點擊“Select Artifact(s) for Upload”按鈕從本機選擇要上傳的構件,然后點擊“Add Artifact”按鈕將其加入到上傳列表中。最后,單擊頁面底部的“Upload Artifact(s)”按鈕將構件上傳到倉庫中。