私服是一種私有服務器,是在局域網中搭建的一種特殊的遠程倉庫,目的是代理遠程倉庫及部署第三方構建,私服搭建成功之后,當maven需要下載構件時,直接請求私服。私服上存在則下載到本地倉庫,不存在才請求外部的遠程倉庫,將構件下載到私服,再提供給本地倉庫下載,可以減少重復網絡流量下載問題。
目前搭建 maven 私服主要有以下三種方式。最主流的就是 Nexus
- Nexus搭建maven私服
- Artifactory搭建maven私服
- Apache Ar-chiva搭建maven私服(不常用)
Nexus介紹:
Nexus是一個強大的Maven倉庫管理器,它極大地簡化了本地內部倉庫的維護和外部倉庫的訪問。如果使用了公共的Maven倉庫服務器,可以從Maven中央倉庫下載所需要的構件(Artifact),但這通常不是一個好的做法。正常做法是在本地架設一個Maven倉庫服務器,即利用Nexus私服可以只在一個地方就能夠完全控制訪問和部署在你所維護倉庫中的每個Artifact。Nexus在代理遠程倉庫的同時維護本地倉庫,以降低中央倉庫的負荷,節省外網帶寬和時間,Nexus私服就可以滿足這樣的需要。Nexus是一套“開箱即用”的系統不需要數據庫,它使用文件系統加Lucene來組織數據。 Nexus使用ExtJS來開發界面,利用Restlet來提供完整的REST APIs,通過m2eclipse與Eclipse集成使用。 Nexus支持WebDAV與LDAP安全身份認證。 Nexus還提供了強大的倉庫管理功能,構件搜索功能,它基於REST,友好的UI是一個extjs的REST客戶端,它占用較少的內存,基於簡單文件系統而非數據庫。
總之,在本地構建nexus私服的好處有:
- 加速構建;
- 節省帶寬;
- 節省中央maven倉庫的帶寬;
- 穩定(應付一旦中央服務器出問題的情況);
- 控制和審計;
- 能夠部署第三方構件;
- 可以建立本地內部倉庫;
- 可以建立公共倉庫
這些優點使得Nexus日趨成為最流行的Maven倉庫管理器。
Nexus搭建maven私服:
1.下載 https://www.sonatype.com/download-oss-sonatype ,我用的是 nexus-3.16.1-02-win64
2.將壓縮包解壓到文件夾:
3.配置環境變量
4.使用 管理員權限操作 Windows PowerShell ,不然會報錯。
相關命令:
/install:安裝 /uninstall:卸載 /stop:停止后台運行 /start:后台運行 /status:查看運行狀態 /run:前台運行,可在cmd命令行查看log
稍等片刻后訪問 http://localhost:8081/ ,可用顯示如下界面即位安裝啟動完成:
Nexus 基本配置:
在 nexus-3.16.1-02/etc 目錄下有個 nexus-default.properties 可用配置服務的相關信息。包括端口、host等。
默認用戶/密碼為 admin/admin123,點擊頁面右上角Sign in 進行登錄。
可以點擊上面的“設置”圖標,在“設置”里可以添加用戶、角色,對接LDAP等的設置,如下:
可以在 Support ----> System information 里查看nexus的系統信息
Nexus倉庫類型介紹:
- hosted,本地倉庫,通常我們會部署自己的構件到這一類型的倉庫。比如公司的第二方庫。
- proxy,代理倉庫,它們被用來代理遠程的公共倉庫,如maven中央倉庫。
- group,倉庫組,用來合並多個hosted/proxy倉庫,當你的項目希望在多個repository使用資源時就不需要多次引用了,只需要引用一個group即可。
管理本地倉庫:
我們前面講到類型為hosted的為本地倉庫,Nexus預定義了3個本地倉庫,分別是Releases, Snapshots, 3rd Party. 分別講一下這三個預置的倉庫都是做什么用的:
- Releases: 這里存放我們自己項目中發布的構建, 通常是Release版本的, 比如我們自己做了一個FTP Server的項目, 生成的構件為ftpserver.war, 我們就可以把這個構建發布到Nexus的Releases本地倉庫. 關於符合發布后面會有介紹.
- Snapshots:這個倉庫非常的有用, 它的目的是讓我們可以發布那些非release版本, 非穩定版本, 比如我們在trunk下開發一個項目,在正式release之前你可能需要臨時發布一個版本給你的同伴使用, 因為你的同伴正在依賴你的模塊開發, 那么這個時候我們就可以發布Snapshot版本到這個倉庫, 你的同伴就可以通過簡單的命令來獲取和使用這個臨時版本.
- 3rd Party:顧名思義, 第三方庫, 你可能會問不是有中央倉庫來管理第三方庫嘛,沒錯, 這里的是指可以讓你添加自己的第三方庫, 比如有些構件在中央倉庫是不存在的. 比如你在中央倉庫找不到Oracle 的JDBC驅動, 這個時候我們就需要自己添加到3rdparty倉庫。
創建自己的倉庫:
相關配置可以參考已存在的 maven-public倉庫來配置。
Maven用到的Repositories說明:
- maven-central:maven中央庫,默認從https://repo1.maven.org/maven2/拉取jar
- maven-releases:私庫發行版jar
- maven-snapshots:私庫快照(調試版本)jar
- maven-public:倉庫分組,把上面三個倉庫組合在一起對外提供服務,在本地maven基礎配置settings.xml中使用。
如果不夠用,自己也可以根據博文上面的倉庫類型進行選用創建。
配置本地 settings 文件:
<servers>
<server>
<id>release</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
</servers>
<profiles>
<profile>
<id>default_profile</id>
<repositories>
<!--包含需要連接到遠程倉庫的信息 -->
<repository>
<!--遠程倉庫唯一標識 -->
<id>wuzz-maven-releases</id>
<!--遠程倉庫名稱 -->
<name>maven-releases</name>
<!--如何處理遠程倉庫里發布版本的下載 -->
<releases>
<!--true或者false表示該倉庫是否為下載某種類型構件(發布版,快照版)開啟。 -->
<enabled>true</enabled>
<!--該元素指定更新發生的頻率。Maven會比較本地POM和遠程POM的時間戳。這里的選項是:always(一直),daily(默認,每日),interval:X(這里X是以分鍾為單位的時間間隔),或者never(從不)。 -->
<updatePolicy>never</updatePolicy>
<!--當Maven驗證構件校驗文件失敗時該怎么做-ignore(忽略),fail(失敗),或者warn(警告)。 -->
<checksumPolicy>warn</checksumPolicy>
</releases>
<!--如何處理遠程倉庫里快照版本的下載。有了releases和snapshots這兩組配置,POM就可以在每個單獨的倉庫中,為每種類型的構件采取不同的策略。例如,可能有人會決定只為開發目的開啟對快照版本下載的支持。參見repositories/repository/releases元素 -->
<snapshots>
<!--true或者false表示該倉庫是否為下載某種類型構件(發布版,快照版)開啟。 -->
<enabled>true</enabled>
<!--該元素指定更新發生的頻率。Maven會比較本地POM和遠程POM的時間戳。這里的選項是:always(一直),daily(默認,每日),interval:X(這里X是以分鍾為單位的時間間隔),或者never(從不)。 -->
<updatePolicy>always</updatePolicy>
<!--當Maven驗證構件校驗文件失敗時該怎么做-ignore(忽略),fail(失敗),或者warn(警告)。 -->
<checksumPolicy>warn</checksumPolicy>
</snapshots>
<!--遠程倉庫URL,按protocol://hostname/path形式 -->
<url>http://localhost:8081/repository/maven-public/</url>
<!--用於定位和排序構件的倉庫布局類型-可以是default(默認)或者legacy(遺留)。Maven 2為其倉庫提供了一個默認的布局;然而,Maven 1.x有一種不同的布局。我們可以使用該元素指定布局是default(默認)還是legacy(遺留)。 -->
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<!--遠程倉庫唯一標識 -->
<id>wuzz-maven-releases</id>
<!--遠程倉庫名稱 -->
<name>maven-releases</name>
<url>http://localhost:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>default_profile</activeProfile>
</activeProfiles>
地址來源於:
然后需要在 pom文件中指定:
<distributionManagement>
<repository>
<id>release</id>
<name>Releases</name>
<url>http://localhost:8081/repository/maven-releases</url>
<uniqueVersion>true</uniqueVersion>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots</name>
<url>http://localhost:8081/repository/maven-snapshots</url>
</snapshotRepository>
</distributionManagement>
然后可以執行 deploy ,就可以把jar 推送到私服,然后把 version 從 1.0-SNAPSHOT 改成 1.0-RELEASE,再去私服上查看:
更多的配置相關還需要深入研究,多用用就會了。