MVN7️⃣私服 & Nexus
1、简介
1.1、团队开发分析
团队开发:一个团队中通常有多个项目(模块)。
若项目 A 要使用项目 B 的代码,该如何获得项目 jar 包?
plan | 可行性 | 分析 |
---|---|---|
将项目 B 打包上传到中央仓库,项目 A 的 Maven 从中央仓库获取 | ❌ | 不允许上传个人 jar 包 |
将项目 B 打包,直接拷贝到项目 A 中 | 👎 | 效率低,不方便管理 |
搭建私服,将方案 1 的中央仓库替换为私服 | 👍 | 见下文 |
1.2、私服(❗)
1.2.1、作用
私服,衍生于 Maven 仓库
作用:解决团队内部的资源共享与同步问题。
- 存储团队私有资源(e.g. 自研产品),第三方资源(购买的非开源产品)。
- 加速项目构建,提高项目稳定性。
- 节省网络带宽,降低中央仓库负载。
1.2.2、私服仓库
私服仓库:私服的本质是服务器,包含多种仓库。
-
类型:
宿主仓库(hosted) 代理仓库(proxy) 仓库组(group) 场景 中央仓库仅保存公共开源项目,
不允许上传私有资源开发除了私服资源,
还需要中央仓库的公共资源开发需要的资源,
存储在私服的不同仓库中作用 保存自研、非开源资源 代理连接中央仓库,简化下载配置 为仓库编组,简化下载配置 关联操作 上传(本地 → 私服) 下载(中央 → 私服) 下载(私服 → 本地) 说明 类型:Release/Snapshot/Mixed 代理仓库可配置阿里云镜像 设计型仓库,本身不保存资源 -
图示:
1.3、仓库管理器
Maven 仓库管理器:即搭建 Maven 私服的软件
- Apache Archiva
- JFrog Artifactory
- Sonatype Nexus(🔥)
2、Nexus(❗)
- 内存小。
- 支持 hosted、proxy、group 仓库。
- 支持仓库索引及搜索。
- 支持界面上传(即👉3.1 手动上传)。
- 基于文件系统,不依赖数据库。
- 安全控制。
- ...
2.1、下载安装
2.1.1、下载
下载地址:解压即安装
部分目录结构:
- nexus-xxx:服务器目录
- bin
- nexus.exe:启动程序。
- nexus.vmoptions:虚拟参数。
- etc
- nexus-default.properties:默认配置(e.g. 端口号 8081)。
- bin
- sonatype-work:工作目录
- nexus3
- admin.password:私服 admin 账号默认密码,首次登录时生成。
- nexus3
2.1.2、启动并访问
-
启动:进入服务器 bin 目录的命令行,执行命令。
# 可省略.exe nexus.exe /run nexus
-
访问:默认地址 localhost:8081
-
登录:Sign in
- 账号:默认 admin
- 密码:默认密码位于
admin.password
,首次登录需要重置密码。
2.2、界面
2.2.1、内容浏览
📦
-
搜索:不支持模糊搜索。
-
浏览:可浏览仓库列表,点击仓库可查看资源。
-
上传:手动上传资源。
2.2.2、仓库管理(❗)
⚙ → Repository → Repositories
-
可浏览仓库列表,点击仓库可配置仓库。
-
可创建仓库。
① 配置代理镜像
maven-central 是默认的代理仓库,即从远程仓库下载并保存资源。
-
点击
maven-central
进入仓库管理页面,可见默认配置的远程仓库为 Maven 中央仓库。 -
将中央仓库替换为镜像仓库,可提高下载速度(详见 👉 Maven 安装:2.3.2)
https://maven.aliyun.com/repository/public
② 创建仓库
点击
Create repository
可以创建新的仓库
-
Recipe:仓库类型,maven2 (hosted/proxy/group)
-
仓库信息:
- Name:名称
- Version policy:版本策略(Release/Snapshot/Mixed),资源上传时会校验项目版本命名。
-
Create repository
③ 仓库组成员
仓库组用于为仓库编组,简化下载配置。
进入仓库组(任意 group 类型的仓库)的管理页面,可以管理成员及顺序。
示例:管理 Nexus 默认仓库组的成员(即 maven-public)
3、上传资源
可上传的资源:团队自研项目,第三方资源。
3.1、手动
通常用于上传第三方资源,即非团队自研也非公共开源 jar 包(e.g. Oracle 数据库)
入口:📦 → Upload → 选择仓库。
-
File:资源文件
-
Extension:后缀(war/jar/...)
-
GAV
3.2、IDEA(❗)
用于上传团队自研项目
- 若要测试私服效果,可先注释阿里云镜像配置以避免影响。
- 本地 Maven 配置与私服 Maven 配置一致,即相同的 setting.xml。
3.2.1、配置
① Maven 设置
settings.xml:私服通用信息,对所有项目通用
-
servers:账号密码(👉 不同账号拥有不同权限,此配置用于访问私服)
-
mirrors:镜像(👉 使用私服来镜像所有仓库,此配置用于下载资源)
-
mirrorOf:要镜像的仓库(
*
代表所有) -
url:私服仓库组的访问路径。
<servers> <server> <id>jaywee-release</id> <username>账号</username> <password>密码</password> </server> <server> <id>jaywee-snapshot</id> <username>账号</username> <password>密码</password> </server> </servers> <mirrors> <mirror> <id>maven-public</id> <!-- 镜像所有仓库 --> <mirrorOf>*</mirrorOf> <!-- 私服仓库组 --> <url>http://localhost:8081/repository/maven-public/</url> </mirror> </mirrors>
-
② 项目配置
pom.xml:对于每个项目而言,使用的私服账号和仓库可能不同。
(可在父模块配置
distributionManagement
,子模块继承获得)
工作机制:发布资源时,Maven 查找 setting.xml 中 id 对应的账号密码,根据 url 访问私服仓库。
-
id:即 server 标签的 id(setting.xml)
-
url:私服仓库地址(hosted)
<distributionManagement> <!-- 发行版 --> <repository> <id>jaywee-release</id> <url>http://localhost:8081/repository/jaywee-release/</url> </repository> <!-- 快照版 --> <snapshotRepository> <id>jaywee-snapshot</id> <url>http://localhost:8081/repository/jaywee-snapshot/</url> </snapshotRepository> </distributionManagement>
3.2.2、上传资源
项目开发完成后,可使用
deploy
构建命令发布。
-
Maven 面板:Lifecycle - deploy
-
Maven 指令:
mvn deploy