企業 Maven 依賴管理層次結構設計 - 附錄

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/centralRemote 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 了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章