快捷搜索:  汽车  科技

maven如何设置依赖多个仓库(Maven仓库配置及远程依赖)

maven如何设置依赖多个仓库(Maven仓库配置及远程依赖)这里为了方便 这里直接用 Docker 进行安装自建 Maven 仓库可以使用 Nexus 或者 JFROG-ARTIFACTORY 这里展示一下安装的方式和图形界面.// Local Repository 通俗来说就是 .m2 文件夹(默认) 或者自定义配置的路径 Maven 构建项目时 会自动将所有依赖项 Jar 下载到本地存储库中 // Central Repository 当 Maven 在本地存储库中找不到任何依赖项时,它就开始在中央存储库中进行搜索 - 中央仓库由Maven社区管理 - 默认配置 不需要额外进行配置 // 远程存储库 开发人员自己的定制存储库,包含所需的库或其他项目 jar 可以在 Setting 或 pom 中进行配置 2.2 依赖搜索序列既然存在3种不同的仓库 那么就存在优先级 :首先要了解云效这个工具 云效是阿里云开放的

一、前言

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

私有仓库有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仓库配置及远程依赖)(1)

四、自建 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

maven如何设置依赖多个仓库(Maven仓库配置及远程依赖)(2)

修改密码及创建账号

// S1 : 进入容器目录 docker exec -it d38ead7860f9 /bin/bash // S2 : 查看密码 cat /nexus-data/admin.password // S3 : 创建账号及权限 (见下图)

maven如何设置依赖多个仓库(Maven仓库配置及远程依赖)(3)

五、简单得上传和下载

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如何设置依赖多个仓库(Maven仓库配置及远程依赖)(4)

maven如何设置依赖多个仓库(Maven仓库配置及远程依赖)(5)

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>六、本地文件详情

maven如何设置依赖多个仓库(Maven仓库配置及远程依赖)(6)

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

_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
来源:稀土掘金

猜您喜欢: