前言
当一个开发者的水平提升到一定程度时,会有由内向外输出价值的需求,包括发布开源项目。而要发布开源组件,则需要将组件发布到公开的远程仓库,如 Jitpack、JenCenter 和 MavenCentral。其中,MavenCentral 是最流行的中央仓库,也是 Gradle 默认使用的仓库之一。
在这篇文章里,我将手把手带你发布组件到 MavenCentral 中央仓库。本文的示例程序使用小彭的开源项目 ModularEventBus 有用请给 Star,谢谢。
这不仅仅是一份攻略,还带着踩过一个个坑留下的泪和挠掉一根根落的宝贵发丝~~~
开发者系列文章:
- MavenCentral 仓库(本文)
- 还在见招拆招?先看懂 APP 个人信息保护治理机制
- 使用 Markdown 高效率编写文档
- 技术周报 | 2021 年第 13 周
- 技术周报 | 2021 年第 11 周
- 技术周报 | 2021 年第 10 周
1. 概念梳理
1.1 什么是 POM?
POM(Project Object Model)指项目对象模型,用于描述项目构件的基本信息。一个有效的 POM 节点中主要包含以下参数:
参数 | 描述 | 举例 |
---|---|---|
groupId | 组织 / 公司名 | io.github.pengxurui |
artifactId | 组件名 | modular-eventbus-annotation |
version | 组件版本 | 1.0.0 |
packaging | 格式 | jar |
1.2 什么是仓库(repository)
在项目中,我们会需要依赖各种各样的二方库或三方库,这些依赖一定会存放在某个位置(Place),这个 “位置” 就叫做仓库。使用仓库可以帮助我们管理项目构件,例如 jar、aar 等等。
主流的构建工具都有 2 个层次的仓库概念:
- 1、本地仓库: 无论使用 Linux 还是 Window,计算机中会有一个目录用来存放从中央仓库或远程仓库下载的依赖文件;
- 2、远程仓库: 包括中央仓库和私有仓库。中央仓库是开源社区提供的仓库,是绝大多数开源库的存放位置。比如 Maven 社区的中央仓库 Maven Central ;私有仓库是公司或组织的自定义仓库,可以理解为二方库的存放位置。
1.3 Sonatype、Nexus 和 Maven 的关系:
- Sonatype: 完整名称是 Sonatype OSSRH(OSS Repository Hosting),为开源项目提供免费的中央存储仓库服务。其中需要用到 Nexus 作为仓库管理器;
- Nexus: 完整名称是 Sonatype Nexus Repository Manager,是 Sonatype 的另一款产品,用作提供仓库管理器。Sonatype 基于 Nexus 提供中央仓库,各个公司也可以使用 Nexus 搭建私有仓库;
- Maven: 完整名称是 Apache Maven,是一种构建系统。除了 Maven 之外,Apache Ant 和 Gradle 都可以发布组件。
2. 新建 Sonatype 项目
从这一节开始,我将带你一步步完成发布组件到中央仓库的操作(带你踩坑)。
2.1 准备 Sonatype JIRA 账号
进入 Sonatype 仪表盘界面,登录或注册新账号: https://issues.sonatype.org :
2.2 新建工单
点击仪表盘面板右上角的 ”新建“ 按钮,按照以下步骤向 Sonotype 提交新建项目的工单:
填写方法总结如下:
- 项目: 使用默认选项 Community Support - Open Source Project Repository Hosting (OSSRH);
- 问题类型: 使用默认选项 New Project;
- 概要: 填写 Github 仓库相同的名称,以方便查找;
- GroupId 组织名: 填写发布组件时使用的 groupId,后续步骤中会检查你是否真实拥有该 groupId,所以不可以随便填写,有 2 种填写方式:
- 使用 Github 账号: 按照
io.github.[Github 用户名]
的格式填写,后续步骤中 Sonatype 通过要求我们在个人 Github 仓库中新建指定名称的临时代码库的方式来做身份验证; - 使用个人域名: 按照逆序域名的格式填写,例如个人域名为
oss.sonotype.org
,则填写org.sonotype.oss
。
- 使用 Github 账号: 按照
- Project URL 项目地址: 填写 Github 项目地址,例如:
https://github.com/pengxurui/ModularEventBus
; - SCM url 版本控制地址: 在 Github 项目地址后加
.git
,例如https://github.com/pengxurui/ModularEventBus.git
。
2.3 验证 GroupId 所有权
点击弹出的消息进入工单详情页,刚新建的工单要等待 Sonotype 机器人回复,等待大概十几分钟后,在工单底部的评论区会告诉我们怎么操作。
至此,Sonotype 项目准备完毕。
3. 新建 GPG 密钥对
GPG(GNU Privacy Guard)是基于 OpenPGP 标准实现的加密软件,它提供了对文件的非对称加密和签名验证功能。所有发布到 Maven 仓库的文件都需要进行 GPG 签名,以验证文件的合法性。
3.1 安装 GPG 软件
安装 GPG 软件有两种方式:
- 方式 1 - 下载安装包: 通过 GPG 官方 下载安装包,这个我没试过;
- 方式 2 - 通过 Homebrew 安装: 使用 Homebrew 执行以下命令:
命令行
# 通过 Homebrew 安装 gpg brew install gpg
如果本地没有 Homebrew 环境则需要先安装,这里也容易踩坑。小彭本地原本就有 Homebrew 环境,但是安装 gpg 的过程中各种报错,最后还是用了最暴力的解法才解决 —— 卸载重装 Homebrew:(
参考资料: MacOS下开发环境配置--homebrew的安装
3.2 生成 GPG 密钥对
使用 --generate-key
参数,按照指引填写相关信息和 passphrase 私钥口令。另外,使用 --list-keys
参数可以查看当前系统中生成过的密钥。
命令行
# 密钥生成命令 gpg --generate-key # 密钥查看命令 gpg --list-keys
命令行演示
GPG 在生成密钥对时,会要求开发者做一些随机的举动,以给随机数加入足够多的扰动,稍等片刻就会生成完成了。完成后可以随时使用 —list-keys