Maven私服倉庫Nexus配置小結
技術前提:熟練的掌握Maven基礎知識
一、什么是Maven私服?
Maven 私服是一種特殊的Maven遠程倉庫,它是架設在局域網(wǎng)內的倉庫服務,用來代理位于外部的遠程倉庫(中央倉庫、其他遠程公共倉庫)。
當然也并不是說私服只能建立在局域網(wǎng),也有很多公司會直接把私服部署到公網(wǎng),具體還是得看公司業(yè)務的性質是否是保密的等等,因為局域網(wǎng)的話只能在公司用,部署到公網(wǎng)的話員工在家里也可以辦公使用。
建立了 Maven 私服后,當局域網(wǎng)內的用戶需要某個構件時,會按照如下順序進行請求和下載。
- 請求本地倉庫,若本地倉庫不存在所需構件,則跳轉到第 2 步;
- 請求 Maven 私服,將所需構件下載到本地倉庫,若私服中不存在所需構件,則跳轉到第 3 步。
- 請求外部的遠程倉庫,將所需構件下載并緩存到 Maven 私服,若外部遠程倉庫不存在所需構件,則 Maven 直接報錯。
此外,一些無法從外部倉庫下載到的構件,也能從本地上傳到私服供其他人使用。
下圖中展示了 Maven 私服的用途。
二、Maven 私服優(yōu)勢
Maven 私服具有以下 5 點優(yōu)勢:
節(jié)省外網(wǎng)帶寬
:大量對于外部遠程倉庫的重復請求,會消耗很大量的帶寬,利用 Maven私服代理外部倉庫后,能夠消除對外部倉庫的大量重復請求,降低外網(wǎng)帶寬壓力。下載速度更快
:Maven 私服位于局域網(wǎng)內,從私服下載構建更快更穩(wěn)定。便于部署第三方構件
:有些構件是無法從任何一個遠程倉庫中獲得的(例如,某公司或組織內部的私有構件、Oracle 的 JDBC 驅動等),建立私服之后,就可以將這些構件部署到私服中,供內部 Maven 項目使用。提高項目的穩(wěn)定性,增強對項目的控制
:如果不建立私服,那么 Maven 項目的構件就高度依賴外部的遠程倉庫,若外部網(wǎng)絡不穩(wěn)定,則項目的構建過程也會變得不穩(wěn)定。建立私服后,即使外部網(wǎng)絡狀況不佳甚至中斷,只要私服中已經緩存了所需的構件,Maven 也能夠正常運行。- 此外,一些私服軟件(如 Nexus)還提供了很多額外控制功能,例如,權限管理、RELEASE/SNAPSHOT 版本控制等,可以對倉庫進行一些更加高級的控制
降低中央倉庫得負荷壓力
:由于私服會緩存中央倉庫得構件,避免了很多對中央倉庫的重復下載,降低了中央倉庫的負荷。
三、Maven 私服搭建
能夠幫助我們建立 Maven 私服的軟件被稱為 Maven 倉庫管理器(Repository Manager),主要有以下 3 種:
- Apache Archiva
- JFrog Artifactory
- Sonatype Nexus
其中,Sonatype Nexus 是當前最流行、使用最廣泛的 Maven 倉庫管理器。本篇文章也是重點講解Sonatype Nexus。
關于nexus安裝:http://www.dbjr.com.cn/article/213578.htm
本篇直接基于nexus3最新版進行講解!
四、Sonatype Nexus介紹
Nexus 的全稱是 Nexus Repository Manager(Nexus 倉庫管理器),是 Sonatype 公司的一個產品。Nexus 是一個強大的倉庫管理器,極大地簡化了內部倉庫的維護和外部倉庫的訪問。Nexus 分為開源版和專業(yè)版,其中開源版足以滿足大部分 Maven 用戶的需求。
Nexus 開源版具有以下優(yōu)點:
- 占用內存?。?8 M 左右)
- 具有基于 ExtJs 得操作界面,用戶體驗較好
- 使用基于 Restlet 的完全 REST API
- 支持代理倉庫、宿主倉庫和倉庫組
- 基于文件系統(tǒng),不需要依賴數(shù)據(jù)庫
- 支持倉庫管理
- 支持構件搜索
- 支持在界面上上傳構件
五、Nexus倉庫屬性和分類
這里我直接用的nexus最新版3.54.1版本。
點擊左邊導航欄中的 Repositories(倉庫),可以看到 Nexus 自帶的幾個內置倉庫,如下圖所示。
在倉庫列表中,每個倉庫都具有一系列屬性:
- Type:倉庫的類型,這里一共有三種
- proxy:用來代理遠程公共倉庫,如 Maven 中央倉庫、JBoss 遠程倉庫。
- hosted:又稱 Nexus 本地倉庫,該倉庫通常用來部署本地項目所產生的構件。 hosted 宿主倉庫又分為:releases 和shapshots,分別表示依賴的版本的發(fā)行版、快照版??煺瞻嬉蕾嚥荒苌蟼鞯桨l(fā)行版?zhèn)}庫,反之亦然。nexus做了限制。
- group:倉庫組,用來聚合代理倉庫和宿主倉庫,為這些倉庫提供統(tǒng)一的服務地址,以便 Maven 可以更加方便地獲得這些倉庫中的構件。
- Format:倉庫的格式有兩種maven2、nuget。我們是搞java的,所以新建倉庫一般都是選擇的maven2格式。
- Status:倉庫的狀態(tài),只有在線狀態(tài)才能被訪問。
- URL:倉庫的路徑
為了更加直觀的理解倉庫組、代理倉庫和宿主倉庫的概念,我們通過下圖展示它們的用途和區(qū)別。
由上圖可知:
- Maven 可以直接從宿主倉庫中下載構件。
- Maven 也可以從代理倉庫中下載構件,代理倉庫會從遠程倉庫下載并緩存構件。
- Maven 還可以從倉庫組中下載構件,倉庫組會從其包含的宿主倉庫和代理倉庫中獲取構件。
我們使用nexus私服,配置文件中配置的也就是倉庫組地址,因為倉庫組可以把代理倉庫、宿主倉庫聚合,這樣就完美實現(xiàn):從私服下載依賴,私服倉庫找不到還能去代理倉庫那找。找到了之后緩存到私服這樣下次就能從私服直接獲取了。
六、Nexus倉庫配置以及創(chuàng)建倉庫
剛安裝好的nexus一共給我們創(chuàng)建了7個倉庫(不同的nexus版本可能有一點差距),我們只需要關注Format為maven2的倉庫即可,也就是一共有4個:
- maven-central:該倉庫用來代理 Maven 中央倉庫,其策略為 Release,只會下載和緩存中央倉庫中的發(fā)布版本的構件。
- maven-releases:策略為 Release 的宿主倉庫,用來部署公司或組織內部的發(fā)布版本構件。
- maven-snapshots:策略為 Snapshot 的宿主倉庫,用來部署公司或組織內部的快照版本構件。
- maven-public:倉庫組,默認聚合了以上三個倉庫
下面進行一個一個講解:
(1)maven-central
我們也可以再新建一個代理倉庫,然后代理到阿里云鏡像地址。通過阿里云鏡像下載依賴要比maven中央倉庫快的多。
選擇maven2 (proxy)
其他配置默認即可。然后代理地址寫:
https://maven.aliyun.com/repository/public
(2)maven-public
maven-public倉庫組就是將這幾個倉庫匯集到一塊,然后項目使用nexus,不需要配置其他倉庫的地址,只需要配置倉庫組的地址即可。
(3)maven-releases
release倉庫需要把這塊改一下,設置為Allow redeploy代表允許我們對倉庫中的依賴維護升級新版本,如果設置為disable redeploy意味著我們無法將升級版本上傳上來。
七、Nexus配置用戶角色
nexus預定了兩個用戶
admin:最高權限
- 瀏覽倉庫
- 搜索倉庫
- 上傳構建
- 新建修改倉庫
anonymous:沒有默認密碼,不可以登錄管理平臺,擁有的權限有如下:
- 瀏覽倉庫
- 搜索倉庫
在低的版本當中可能會有一個deployment角色,不知道為什么新的版本當中這個角色給取消了。
一般我們不建議maven當中直接去配置admin賬戶,因為admin賬戶有新增和刪除倉庫的權限,我們可以選擇新增一個賬戶,只給這個賬號賦予上傳依賴和下載依賴的權限即可,由于nexus是用戶角色制,所以新增賬戶前,首先我們需要新建一個角色。然后讓角色只具備上傳依賴和下載依賴的權限。然后再給用戶賦予該角色權限。
(1)新增角色
Role ID和Role Name自定義即可。
具體的需要新增的權限如下:
別忘了右下角保存!
(2)新增用戶,并指定該角色
這時候可以使用新賬號登錄測試一下,登錄后會發(fā)現(xiàn)他沒有設置的權限,這就是我們要的效果!
八、Maven SNAPSHOT(快照)
接下來我們可能會頻繁接觸SNAPSHOT版本,在這里我們先熟悉一下這個版本號。
在我們是實際開發(fā)的項目當中很少會定義beat 、alpha 這些里程碑版本,因為這些一般都是開源框架才會定義的,他代表了一個特殊的寓意,例如beat就是測試版本,而我們經常在開發(fā)中會定義SNAPSHOT版本。SNAPSHOT不同于里程碑版本,里程碑版本他也就是一個普通的版本名稱,說白了只是用這些英文來代表這個版本的含義,而SNAPSHOT對于私服來說是有特殊功能的。
使用場景: 大型的應用軟件通常由多個功能模塊組成,這些模塊有時候分別于不同的團隊負責開發(fā)。假設有兩個團隊,他們分別負責項目中的 member-service(會員服務) 和 user-service(用戶服務) 兩個模塊,且 member-service 需要依賴 user-service 項目。
基于以上假設,若 user-service 團隊正在進行快節(jié)奏的 bug 修復及功能增強,會在短時間內高頻率地更新代碼以及發(fā)布版本。就會出現(xiàn)以下情況:
- user-service 團隊每次發(fā)布新版本更新代碼時,都應該通知member-service團隊。
- member-service 團隊則需要定期更新其 pom.xml 以獲得最新的版本。
這樣,勢必會影響開發(fā)效率,甚至會影響項目的驗收及投產。要解決這個問題,其實很簡單,那就是使用 SNAPSHOT(快照)版本。
版本介紹: SNAPSHOT(快照)是一種特殊的版本,它表示當前開發(fā)進度的副本。與常規(guī)版本不同,快照版本的構件在發(fā)布時,Maven 會自動為它打上一個時間戳,有了這個時間戳后,當依賴該構件的項目進行構建時,Maven 就能從倉庫中找到最新的 SNAPSHOT 版本文件。
默認情況下對于快照本本的構件,Maven 會每天從倉庫中獲取一次更新,用戶也可以在任何 Maven 命令中使用 -U
參數(shù)強制 Maven 檢查更新。命令如下:mvn clean package -U
SNAPSHOT 版本 VS RELEASE 版本
Maven 倉庫分為兩種,Snapshot 快照倉庫和 Release 發(fā)行倉庫。Snapshot 快照倉庫用于保存開發(fā)過程中的不穩(wěn)定 SNAPSHOT 版本,Release 發(fā)行倉庫則用來保存穩(wěn)定的 RELEASE 版本。Maven 會根據(jù)模塊的版本號(pom.xml 文件中的 version 元素)中是否帶有 -SNAPSHOT 來判斷是 SNAPSHOT 版本還是正式 RELEASE 版本。帶有 -SNAPSHOT 是SNAPSHOT(快照)版本,不帶 -SNAPSHOT 的就是正式 RELEASE(發(fā)布)版本。
九、項目當中配置Nexus上傳依賴
首先找到本地maven的setting.xml(在maven安裝目錄的conf目錄下),打開后找到servers標簽。加入以下內容
<servers> <!-- 這是配置訪問私有倉庫的用戶名密碼 --> <server> <!-- id標簽可以隨便填,只需要在servers中唯一即可,后面很多地方會使用該id --> <id>self-maven</id> <username>deplyment</username> <password>deplyment123</password> </server> </servers>
maven配置好了,接下來去maven項目中設置:
在你想上傳的模塊的pom文件中,寫入:
<distributionManagement> <repository> <!--注意這個id一定要填寫我們maven的setting.xml當中配置的id--> <id>self-maven</id> <url>http://ip:port/repository/maven-releases/</url> </repository> <snapshotRepository> <!--注意這個id一定要填寫我們maven的setting.xml當中配置的id--> <id>self-maven</id> <url>http://ip:port/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement>
- distributionManagement:負責將指定的構件部署到 Nexus 指定的倉庫中。
- repository:代表上傳release版本存儲的倉庫地址
- snapshotRepository:代表上傳snapshot版本存儲的倉庫地址
- 標簽中的 id,就是上面我們配置的server id,maven會通過這個id去server中拿用戶名密碼去訪問私服倉庫。
- 標簽中的url,就是對應倉庫的地址:倉庫的url復制即可,注意對應倉庫,弄反了是傳不上去的
會根據(jù)該模塊的版本進行自動選擇,如果你的版本號帶有SNAPSHOT如:
<version>0.0.1-SNAPSHOT</version>
,那么會上傳到SNAPSHOT倉庫,release也是這個道理,如果版本號不存在這兩個單詞,如1.0.0,那么會選擇release倉庫上傳。
(1)接下來我們進行測試,首先第一步準備一個不是web工程的項目,如下:
(2)然后進行以下步驟:
當然也可以直接運行maven命令:mvn clean deploy -DskipTests
(3)deploy執(zhí)行完不報錯的話就上傳成功了。
(4)由于我的項目設置的是1.0-SNAPSHOT,也就是SNAPSHOT版本,所以他會自動上傳到maven-snapshots倉庫當中,如下:
十、項目當中配置Nexus下載依賴
接下來,配置本地maven。還是打開setting.xml,然后添加一個如下配置:
<profiles> <profile> <id>nexus</id> <!--聲明一個或多個遠程倉庫 --> <repositories> <!-- 聲明一個 Nexus 私服上的倉庫 --> <repository> <!--倉庫id,這個id就是上面配置的賬號密碼id --> <id>self-maven</id> <!-- 倉庫的名稱 --> <name>nexus</name> <!--倉庫的地址 --> <url>http://localhost:8081/repository/maven-public/</url> <!-- 是否開啟該倉庫的 release 版本下載支持 --> <releases> <enabled>true</enabled> </releases> <!-- 是否開啟該倉庫的 snapshot 版本下載支持 --> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> <!-- 聲明一個或多個遠程插件倉庫 --> <pluginRepositories> <!--聲明一個 Nexus 私服上的插件倉庫 --> <pluginRepository> <!--插件倉庫 id --> <id>self-maven</id> <!--插件倉庫 名稱 --> <name>nexus</name> <!-- 配置的插件倉庫的地址 --> <url>http://localhost:8081/repository/maven-public/</url> <!-- 是否開啟該插件倉庫的 release 版本下載支持 --> <releases> <enabled>true</enabled> </releases> <!-- 是否開啟該插件倉庫的 snapshot 版本下載支持 --> <snapshots> <enabled>true</enabled> </snapshots> </pluginRepository> </pluginRepositories> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> <!-- 默認該profile生效 --> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles>
以上配置中使用了一個 id 為 nexus 的 profile,這個 profile 中包含了與倉庫相關的配置,同時配置中activeByDefault為true。當本機有 Maven 項目構建時,profile 中的倉庫配置就會應用到項目中。配置當中的url就配置我們的倉庫組地址即可:
(1)接下來進行測試下載依賴,首先讓一個web工程引用該項目坐標
(2)緊接著我們需要找到本地maven倉庫當中的introduce包給刪除掉
根據(jù)坐標就可以在本地倉庫找到進行刪除,刪除前要保證引用該依賴的工程不是啟動狀態(tài),不然刪除不了
(3)再次測試web工程看看能否獲取到依賴,需要刷新該工程,讓他再次去獲取依賴。
(4)刷新過后查看倉庫已經存在了該依賴jar,我們并沒有手動去install該項目,那也就意味著他是通過私服進行下載的。
(5)假如缺少依賴,除了上面通過idea當中的刷新,也可以選擇執(zhí)行命令來下載依賴,mvn clean install
的時候也會自動下載倉庫當中缺少的依賴,通過下載依賴的信息我們可以知道他從哪個倉庫進行下載依賴的:
Nexus 私服通常會與鏡像(mirror)結合使用,使 Nexus 成為所有遠程倉庫的私服,這樣不僅可以從 Nexus 中獲取所有所需構件,還能將配置集中到 Nexus 私服中,簡化 Maven 本身的配置。
我們可以創(chuàng)建一個匹配任何倉庫的鏡像,鏡像的地址為 Nexus 中倉庫的地址,這樣 Maven 對于任何構件的下載請求都會被攔截跳轉到 Nexus 私服中,在maven的setting.xml當中配置,其具體配置如下。
<mirrors> <mirror> <id>self-maven</id> <name>nexus name</name> <mirrorOf>*</mirrorOf> <url>http://localhost:8081/repository/maven-public/</url> </mirror> </mirrors>
之前阿里的鏡像可以注釋了,添加的鏡像標簽解釋:
- id:之前server的id,訪問倉庫組也要拿用戶名密碼
- mirrorOf:
*
代表所有的依賴都從私服找 - url:就是倉庫組的,還是去倉庫組右邊copy即可
這樣的話項目就完全依賴于nexus倉庫了,假如一旦nexus掛了,整個項目都沒辦法下載包了,這時候可以將鏡像替換為阿里云,這樣一來除了公司內部包無法下載,最起碼中央倉庫的包還是可以下載的。
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
十一、測試SNAPSHOT版本
我們基于上面提到的introduce工程和demo工程再順便測一下SNAPSHOT版本。一般SNAPSHOT版本是為了解決多個人同時開發(fā)所產生的問題,而我沒有多臺電腦,所以模擬起來也比較費勁。
(1)我們需要手動保留一份倉庫當中修改前的代碼。
(2)修改一下introduce工程,然后將該工程重新deploy到倉庫。
(3)刪除本地倉庫的introduce工程,將剛剛備份的introduce1改為introduce。這時候introduce1的工程代碼當中那個輸出的還是1111111。
(4)看看demo工程通過mvn clean install -DskipTests -U
(-U是強制更新)是否會更新
(5)成功更新了
十二、Nexus構件搜索
十三、手動上傳構件
有些 Jar 文件(如 Oracle 的 JDBC 驅動)由于許可證等原因,無法存放在公開倉庫中。此外,還有一些小型的開源項目,它們沒有將自己的構件分發(fā)到公共倉庫中,也沒有維護自己的倉庫,因此這些構件是無法從公共倉庫中獲得的。若 Maven 項目中需要這類構件,我們就需要將構件下載到本地,然后手動上傳到 Nexus 私服。
(1)準備一個項目,版本號不要是SNAPSHOT版本的
(2)mvn clean install,進行打包
(3)在 Nexus 界面的upoad上傳,默認是只允許上傳releases倉庫。
生成的就是一個帶有該項目坐標的pom。
如果該jar包還有其他依賴,那么需要手動上傳pom.xml文件,就不能點擊上面的generate生成了,通過點擊add another asset 增加,操作如下
手動上傳jar需要注意:
首先,打包要打成不可執(zhí)行jar包;其次,jar如果有其他依賴,一定要單獨上傳pom.xml文件,否則關聯(lián)依賴無法拉取
十四、關于nexus代理倉庫狀態(tài)
online-remote available:表示該被代理倉庫可用online-ready to connect:并不是代理倉庫用不了。而是你根本還沒有一個依賴去訪問這個被代理倉庫,nexus也不知道這個被代理倉庫能不能用,所以它只能展示為待連接狀態(tài)。
新建的代理倉庫都是 online-ready to connect狀態(tài)。
代理倉庫還有一個如下配置:
Blocked:假如選中相相當于禁用該代理倉庫。Auto blocking:該配置:表示代理倉庫會根據(jù)每次請求被代理倉庫的響應來決定是否暫停請求這個被代理倉庫,請求無響應就會block。
到此這篇關于Maven私服倉庫Nexus配置小結的文章就介紹到這了,更多相關Nexus 配置內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
BeanFactory和FactoryBean的區(qū)別示例詳解
這篇文章主要為大家介紹了BeanFactory和FactoryBean的區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10mybatis foreach遍歷LIST讀到數(shù)據(jù)為null的問題
這篇文章主要介紹了mybatis foreach遍歷LIST讀到數(shù)據(jù)為null的問題,具有很好的參考價值,希望對大家有所幫助。2022-02-02