Chat 文章地址: 企業 Maven 依賴管理層次結構設計
由於文章涉及內容太多,不想在文章中包含太多基礎的內容,但是對於瞭解不深的人來說,沒有這些內容也不容易真正掌握,因此在博客上通過本文附加一些額外的內容來完善上述 Chat。
1. 搭建 Nexus 私服
下載地址
Docker方式
安裝文檔
爲了簡單快速演示,本文直接通過 Docker 方式運行。
DockerHub: Sonatype Nexus3 Docker: sonatype/nexus3
直接通過下面的命令啓動:
docker run -d -p 8081:8081 --name nexus sonatype/nexus3
等待啓動成功後,通過瀏覽器打開 http://localhost:8081/,此時可以看到下面的界面:
Browse 界面如下:
這個界面重要的倉庫分別如下:
- maven-central: 類型是 proxy,代理的意思,這裏會轉發到 maven 中央倉庫去下載。
- maven-releases: 類型是 hosted,當前倉庫直接存放 releses 發佈版的構建(jar,pom等)
- maven-snapshots: 和上面一樣是 hosted,存放快照版。
- maven-public: 類型是 group,一個公開的組,最常用的倉庫是 public,這個組包含了上面的 3 個倉庫,並且按照 releases, snapshots, central 的順序配置,優先選擇本地的發佈版,其次是快照版,最後是去中央倉庫去找。下圖是該倉庫順序的配置:
進入上述 Nexus 網站後,右上角可以登錄,默認登錄密碼在(容器中) /nexus-data/admin.password
中:
# 通過下面命令進入容器
$ docker exec -it nexus /bin/bash
# 查看密碼
$ cat /nexus-data/admin.password
得到密碼後,使用 admin
賬號進行登錄,然後設置新的密碼,這裏爲了演示和全文的一致,本文設置密碼爲 123456
。
2. 配置 Aliyun 代理倉庫
雖然 Maven 中央倉庫的速度已經可以接受了,但是配置一個國內的鏡像源會讓下載速度變得更快,國內目前最穩定的就是 AliRepo。
接下來我們增加一個代理來配置 AliRepo 的 central
。
登錄 Nexus,然後點擊下圖所示按鈕進入管理界面:
左側菜單打開 Repositories
:
點擊【Create Repository】按鈕,然後選擇 maven2(proxy)
,Name 輸入 AliRepo
,然後粘貼前面提到的 url https://maven.aliyun.com/repository/central
到 Remote storage 中。輸入內容如下圖所示。
拖到最下面,點擊 【Create repository】按鈕即可創建完成。
前面提到過 maven-public 倉庫是一個最常用的倉庫組,真正使用的時候很少直接指定具體某個倉庫,通常使用這個組,因此想要方便的使用剛剛新增的 AliRepo,還需要配置 maven-public 組中的內容和順序:
如上圖所示,將 AliRepo 從左側添加到右側 Members 中,然後調整順序到 maven-central 上面,這樣就會優先從 AliRepo 下載依賴。
3. 個人 Maven 配置
想要使用上面的倉庫,以及 deploy 到 Nexus 私服,還需要每個用戶(開發人員)在自己電腦上配置 Maven 的 settings.xml,關鍵的部分配置如下:
<servers>
<!-- 快照版用戶配置 -->
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
<!-- 發佈版用戶配置 -->
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
<!-- 所有 Maven 依賴下載都走私服 -->
<mirrors>
<mirror>
<id>central</id>
<name>central</name>
<url>http://localhost:8081/repository/maven-public/</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
注意上面配置的用戶密碼。
這裏爲了簡單直接用的 admin, 企業爲了控制權限可以創建不同的賬號和密碼。
有了上面的配置後,所有依賴都會通過上面的鏡像地址進行下載。
4. 什麼是 SNAPSHOT 快照版?
注意下面所示的 pom.xml 文件中的 version 標記的值有一個後綴: -SNAPSHOT
。
<project xmlns="http://maven.apache.org/POM/4.0.0"
...
<groupId>...</groupId>
<artifactId>my-app</artifactId>
...
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</name>
...
The SNAPSHOT value refers to the ‘latest’ code along a development branch, and provides no guarantee the code is stable or unchanging. Conversely, the code in a ‘release’ version (any version value without the suffix SNAPSHOT) is unchanging.
SNAPSHOT
指的是開發分支上的“最新”代碼,不能保證代碼是穩定的或不變的。 相反,“發佈”版本中的代碼(沒有SNAPSHOT
後綴)是穩定不變的。
In other words, a SNAPSHOT version is the ‘development’ version before the final ‘release’ version. The SNAPSHOT is “older” than its release.
換句話說,SNAPSHOT
版本是最終發佈版本之前的開發版本。 SNAPSHOT
比它的發佈版時間“更早”。
During the release process, a version of x.y-SNAPSHOT changes to x.y. The release process also increments the development version to x.(y+1)-SNAPSHOT. For example, version 1.0-SNAPSHOT is released as version 1.0, and the new development version is version 1.1-SNAPSHOT.
在發佈過程中,x.y-SNAPSHOT
的一個版本更改爲 x.y
。 發佈過程還將開發版本遞增到 x. (y + 1)-SNAPSHOT
。 例如,版本1.0-SNAPSHOT
作爲版本1.0
發佈,新的開發版本是1.1-SNAPSHOT
版本。
5. Redeploy 重新發布 Release
如果一個 release 版本發佈到了 Nexus,默認情況下是不能再次發佈的,如果允許發佈,就會出現同一個版本的不同的版本。這是因爲如果其他人使用了你這個版本,這個版本會下載到其他人本地倉庫中,你重新 deploy 後,對方本地倉庫的 release 版本不會重新下載,因此對已經下載的人就無效了。
所以如果想要 redeploy,還要通知所有下載過的人刪除本地倉庫的依賴再重新下載最新版本。一般遇到這個問題都是建議發佈一個新的版本。
如果想讓倉庫可以 redeploy,可以在 maven-release 下面配置:
配置後,就可以重新執行 maven deploy
了。