一、前言
業務開發中我們可能涉及到私有包的概念 , 這一篇就看看私有倉庫的相關概念以及如何使用這些私有倉庫
私有倉庫有2大方向 , 一個是通過阿里雲的私有倉庫來搭建自己的倉庫 . 另外可以自行搭建倉庫.
二、倉庫概念
2.1 Maven倉庫分類
Maven 倉庫分為3個部分 : local 本地倉庫 , central 中央倉庫 , remote 遠程倉庫.
// Local Repository
通俗來說就是 .m2 文件夾(默認) 或者自定義配置的路徑 , Maven 構建項目時 , 會自動將所有依賴項 Jar 下載到本地存儲庫中
// Central Repository
當 Maven 在本地存儲庫中找不到任何依賴項時,它就開始在中央存儲庫中進行搜索
- 中央倉庫由Maven社區管理
- 默認配置 , 不需要額外進行配置
// 遠程存儲庫
開發人員自己的定製存儲庫,包含所需的庫或其他項目 jar , 可以在 Setting 或 pom 中進行配置
2.2 依賴搜索序列
既然存在3種不同的倉庫 , 那麼就存在優先級 :
- Step 1 : 在本地存儲庫中搜索依賴項
- Step 2 : 在中央存儲庫中搜索依賴項 , 如果沒有配置遠程庫 , 則拋出異常
- Step 3 : 如果配置了遠程庫 , 在遠程存儲庫或存儲庫中搜索依賴項,
三、通過阿里雲配置遠程倉庫
首先要了解雲效這個工具 , 雲效是阿里雲開放的DevOps平台 , 其個人可以免費使用 , 包括代碼管理和DevOps 持續發布的能力 , 同樣遠程倉庫也基於該平台實現.
四、自建 Maven 私庫
自建 Maven 倉庫可以使用 Nexus 或者 JFROG-ARTIFACTORY ,這裡展示一下安裝的方式和圖形界面.
這裡為了方便 , 這裡直接用 Docker 進行安裝
// Docker
docker pull sonatype/nexus3
// 創建容器卷
mkdir -p /docker/nexus/
chmod 755 /docker/nexus/
// 啟動容器
docker run -d --restart always --name nexus3 -p 8081:8081 -v /docker/nexus:/var/nexus-data sonatype/nexus3
修改密碼及創建帳號
// S1 : 進入容器目錄
docker exec -it d38ead7860f9 /bin/bash
// S2 : 查看密碼
cat /nexus-data/admin.password
// S3 : 創建帳號及權限 (見下圖)
五、簡單得上傳和下載
Maven 私有庫上傳
// S1 : Setting 文件中配置 Server
<server>
<id>antBalckRemote</id>
<username>antblack</username>
<password>123456</password>
</server>
// S2 : Pom 文件中配置 repository
<distributionManagement>
<repository>
<id>antBalckRemote</id>
<name>maven-nexus</name>
<url>http://ip:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>antBalckRemote</id>
<name>maven-nexus</name>
<url>http://ip:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
// 補充 : 常見問題
- timeout : 通常是 url 配置的不對
- 401 : 通常是 Server 配置的帳號密碼權限問題
- 405 : 這裡通常是配置的 repository 的問題 , 注意選擇 Maven 倉庫
Maven 私有庫下載
// 私有庫的下載主要在 Setting.xml 中配置, 這裡先展示一種簡單的方式
<profiles>
<profile>
<id>dev</id>
<repositories>
<repository>
<id>group-maven</id>
<name>group-maven</name>
<url>http://ip:8081/repository/maven-releases/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
<repository>
<id>group-maven-snapshots</id>
<name>group-maven-snapshots</name>
<url>http://ip:8081/repository/maven-snapshots/</url>
<releases>
<enabled>false</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
六、本地文件詳情
來關注一下這些文件有什麼作用 :
_remote.repositories
- 從上面內容可以看到 , remote 庫中存在文件 jar 和 pom
- 該 repositories 用於標識下載文件的信息
// 例如 : (PS : 我配置了一個叫 group-maven 的 profile)
demo-0.0.1-RELEASE.jar>group-maven= : 表示文件從 profiles > repository > group-maven 庫中獲取
// 複雜點 : (如果存在多行)
多了一行通常說明更換了新得遠程源 ,且該數據源中存在文件
lastUpdated
如果更換了 Setting 文件 , 且新的遠程庫沒有該資源 , 就會生成一個 xxx.lastUpdate 文件
lastUpdated 中通常包含這些信息 :
http\://120.1.1.1\:8081/repository/maven-snapshots/.error=
https\://packages.aliyun.com/maven/repository/123123-snapshot-LwE1yj/.error=
https\://packages.aliyun.com/maven/repository/123123-snapshot-LwE1yj/.lastUpdated=1656339413777
http\://120.1.1.1\:8081/repository/maven-snapshots/.lastUpdated=1656339413466
在多倉庫的環境下 , 分別從多個倉庫中查找了依賴 , 如果查詢失敗 , 則會接 .error 後綴.
// 重點 :
如果之前遠程庫由於某些原因 (權限 ,認證 , 異常) , 導致Jar拉取失敗 ,
則該文件會導致後續正常後跳過該遠程倉庫 (可以理解為排除 lastUpdate 中 error 的部分)
七、其他幾種配置多遠程倉庫的方式
多庫有多種配置方式 , 常見的兩種主要是 : 代理模式 和 配置方式
PS:雲效遠程倉庫中需要通過倉庫管理查看 Server 信息 (注意他把帳號密碼隱藏了,要點一下小眼睛)
通過 Pom 文件中配置 repositories 進行處理
<!-- S1 : 如果需要認證 , Setting 中配置對應的 Server -->
<server>
<id>rdc-releases</id>
<username>123123123</username>
<password>123123123]</password>
</server>
<!-- S2 : pom 文件中配置 repositories -->
<repositories>
<repository>
<id>rdc-releases</id>
<url>https://packages.aliyun.com/maven/repository/123-release-123123/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>antBalckRemote</id>
<url>http://123.456.789.123:8081/repository/maven-snapshots/</url>
</repository>
</repositories>
通過配置多 Profiles
<profiles>
<profile>
<id>rdc</id>
<repositories>
<repository>
<id>rdc-release</id>
<name>rdc-release</name>
<url>https://packages.aliyun.com/maven/repository/123-release-ABVCDSFA/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</profile>
<profile>
<id>dev</id>
<repositories>
<repository>
<id>group-maven-snapshots</id>
<name>group-maven-snapshots</name>
<url>http://123.123.123.123:8081/repository/maven-snapshots/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<servers>
<server>
<id>rdc-release</id>
<username>...</username>
<password>....</password>
</server>
<server>
<id>antBalckRemote</id>
<username>....</username>
<password>.....</password>
</server>
</servers>
通過 Mirror 進行鏡像配置
mirror 本質上並不能同時加載多個倉庫內的文件 , 其本質上還是和 profile 進行配合使用
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>aliyun</mirrorOf>
<url>http://repo.mycompany.com/proxy</url>
</mirror>
</mirrors>
// 什麼是鏡像 ?
如果 X 中可以獲取到 Y 庫的所有包 , 則認定 X 是 Y的鏡像.
// 鏡像的作用 ?
可以通過配置 mirror 把所有執行遠程庫的包指向鏡像
// 如何映射
mirrorOf 進行映射 , 和 profile 中的 ID 進行匹配
// 不同 mirrorOf 的作用 ?
- central : 為中央倉庫的鏡像,任何對於中央倉庫的請求都會轉至該鏡像
- * : 該配置是所有Maven倉庫的鏡像
- repo1,repo2 : 匹配倉庫repo1和repo2,使用逗號分隔多個遠程倉庫
- *,!repo1 : 匹配所有遠程倉庫,repo1除外
// 鏡像的問題
- 由於鏡像倉庫完全屏蔽了被鏡像倉庫,當鏡像倉庫不穩定或者停止服務的時候,Maven仍將無法訪問被鏡像倉庫
// 多個 Mirror 的作用
雖然 mirrors 可以配置多個子節點,但是它只會使用其中的一個節點 , 只有當前一個 mirror 無法連接的時候,才會去找後一個
// 如何變相的做到多倉庫 ?
1. 私庫中代理中央倉庫的目的 , 可以加快速度 , 同時可以拉取私庫中不存在的公共包
2. 拉取時首先從私庫處理 , 再從中央庫拉取jar
作者:AntBlack
連結:https://juejin.cn/post/7114666430804525064
來源:稀土掘金