Maven倉庫配置及遠程依賴

互聯網高級架構師 發佈 2022-07-04T06:57:30.663179+00:00

Maven 倉庫分為3個部分 : local 本地倉庫 , central 中央倉庫 , remote 遠程倉庫.其他幾種配置多遠程倉庫的方式。

一、前言

業務開發中我們可能涉及到私有包的概念 , 這一篇就看看私有倉庫的相關概念以及如何使用這些私有倉庫

私有倉庫有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
來源:稀土掘金

關鍵字: