Maven : 仓库配置及远程依赖[通俗易懂]

Maven : 仓库配置及远程依赖[通俗易懂]一 . 前言 业务开发中我们可能涉及到私有包的概念 , 这一篇就看看私有仓库的相关概念以及如何使用这些私有仓库 私有仓库有2大方向 , 一个是通过阿里云的私有仓库来搭建自己的仓库 . 另外可以自行搭建

首先分享之前的所有文章 , 欢迎点赞收藏转发三连下次一定 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164…
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca…

一 . 前言

业务开发中我们可能涉及到私有包的概念 , 这一篇就看看私有仓库的相关概念以及如何使用这些私有仓库

私有仓库有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 持续发布的能力 , 同样远程仓库也基于该平台实现.

image.png

三 . 自建 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

image.png

修改密码及创建账号

// S1 : 进入容器目录
docker exec -it d38ead7860f9 /bin/bash

// S2 : 查看密码 
cat /nexus-data/admin.password

// S3 : 创建账号及权限 (见下图)

image.png

四. 简单得上传和下载

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 仓库

image.png

image.png

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>

五 . 本地文件详情

image.png

来关注一下这些文件有什么作用 :

_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


总结

完结 , 下一篇来进行实际业务上的分析

参考文档

www.cnblogs.com/AlanLee/p/6…

blog.csdn.net/weixin_4496…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13236.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注