从0发布一个构建到 Maven 中央仓库

从0发布一个构建到 Maven 中央仓库

原创内容

在这之前一直使用 Nexus OSS 的搭建私有仓库,今天想起折腾一下如何将一个构建发布到 Maven 的中央仓库当中,于是有了下面的云云……

sonatype

从0发布一个构建到Maven中央仓库

注册 Sonatype 账号

登录 Sonaytype Jira 创建一个 issue

创建一个 issue

  1. Project 选择 Community Support - Open Source Project Repository Hosting (OSSRH)
  2. Issue Type 选择 new Project
  3. Summary 输入你的 项目介绍
  4. GroupId 填写你的工程使用的 groupId,如 com.github.xxx,如果是其他,必须是自己的域名,必要时,管理员会要求你用填写域名的邮箱发送验证邮件来证明域名是你的;
  5. 其他不用填写,直接点击 Create,创建一个 issue
  6. 接下来就是等待回复了;

issue审批通过之后你会收到回复,like this:

issue回复

这样就算是审批通过了,接下来就可以开始进入下一步发布构建了;

更新本地 Maven 的 setting.xml 文件

<!-- lang: xml -->
<settings>
    ...
    <servers>
        <server>
            <id>oss</id>
            <username><![CDATA[sonatype username]]></username>
            <password><![CDATA[password]]></password>
        </server>
    </servers>
    ...
</settings>

生成 GPG 签名

在上一步等待 issue 审核的过程中,我们也不要闲着,开始折腾如何生成 GPG 签名,这是后续必须要经历的流程;

这里我只演示 macOS 下生成和上次 GPG 的流程,其他 OS 的童鞋请自行 google

$ brew install gpg
....
$ gpg --version
gpg (GnuPG) 2.2.8
libgcrypt 1.8.3

## 安装完成,开始生成
$ gpg --gen-key
# 接下来会要求输入 username 和 email,请对号入座,确认信息之后会弹出一个 shell 对话框,要求输入签名秘钥passphrase,输入一个自己记得住的秘钥,一定要记下来,以后每次 deploy 都会使用到。确认后完成签名的生成。

# 生成之后会打印一堆信息;最好保存下来,其中:
....
gpg: 密钥 B3A4160E0484CEF0 被标记为绝对信任
....
B3A 开头的那个为签名的公钥ID,下面会用到。

# 可以通过下面的命令查看是否生成成功
$ gpg --list-keys

# 上传 GPG 公钥到秘钥服务器
$ gpg --keyserver hkp://pool.sks-keyservers.net --send-keys 公钥ID

# 通过下面的命令验证是否上传成功
$ gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys 公钥ID

# 到这里,你可以去看看 sonatype issue 是不是已经有 comment 了

修改你的 POM 文件

在你的 pom.xml 文件中添加如下内容:

<profiles>
    <profile>
        <id>sonar</id>
        <build>
            <plugins>
                <!-- GPG -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-gpg-plugin</artifactId>
                    <version>${maven-gpg-plugin.version}</version>
                    <executions>
                        <execution>
                            <id>sign-artifacts</id>
                            <phase>verify</phase>
                            <goals>
                                <goal>sign</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <skip>${gpg.skip}</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
        <distributionManagement>
            <snapshotRepository>
                <id>oss</id>
                <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
            </snapshotRepository>
            <repository>
                <id>oss</id>
                <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
            </repository>
        </distributionManagement>
    </profile>
</profiles>

当然你还应该有一些默认的 plugin,例如:maven-compiler-plugin 和 maven-source-plugin 也是必须的,请自行添加;

昨晚上面的这些,一切就已经准备就绪了,如果遇到什么错误,可以查看文末的常见错误解决方案;或者 google,作为一个 coder,一定要学会 google,不要告诉我你不会!!!

发布构建到 Sonatype

我 pom.xml 里面定义的 profiles id 为“sonar”,所以我执行下面的 Command

$ mvn clean deploy -Psonar

## 过程中会要求输入前面生成 GPG 秘钥的 passphrase,输入即可

如果执行报错,你可以添加 -e 打印具体什么错误,辅助解决问题;

如果不出意外,整个过程将会一帆风顺,刷过几屏日志之后,本地 Maven 构架就已经上传到 Sonatype 的 OSS 暂存仓库上了,注意只是StagingRepositories,还没有到中央仓库;

这是就可以登录 https://oss.sonatype.org/ 查看了
点击 左侧菜单栏当中的 Staging Repositiries,在右上角的搜索框中输入自己的 groupId 进行模糊检索;找到自己刚才 deploy 的构建;如下图所示:

Staging Repositiries

勾选构建,点击 Close ,输入一段 Description 之后点击 Confirm 按钮;
之后需要等待一段时间,等 Close Staging 的状态生效之后,就可以再次登录oss找到自己的构建,选中之后,点击 Release 按钮;再次 Confirm 之后,恭喜你,你的构建已经正式发布到 Maven 中央仓库了。

接下来,到中央仓库:https://search.maven.org/ 搜索到你的构建了,如果没有搜索到,稍等片刻一定会有的,OSS 同步到中央仓库需要一点点时间;

如果你已经在中央仓库搜索到自己的构建了,记得回到 sonatype 的 jira issue 里面回复管理员你已经完成了构建,可以 Close this issue 了;

意外的惊喜

当你走过上面的全部流程,你一定会觉得偌大的Sonatype发布为啥这么繁琐复杂,那你一定错了,这只是第一次,接下来你已经拥有了发布相同groupId构建的权限;不需要再提 issue,直接 deploy 你的 maven 构建,登录 oss 找到 Staging 记录,依次点击Close……等待……Release……再等待一小会儿,你的构建就同步到中央仓库了。

当然别忘了,GPG 签名别丢,更换电脑可以安装 GPG 签名生成步骤生成新的 GPG 公私秘钥;


常见错误:

gpg: 签名时失败处理

gpg: signing failed: Inappropriate ioctl for device

解决方案

如果你 macOS,很可能遇到该问题;由于通过 brew 安装的GPG版本是最新版本,存在一些兼容性问题;需要在~/.gnupg目录下增加两个配置文件:

echo "use-agent \ npinentry-mode loopback" > gpg.conf
echo "allow-loopback-pinentry" > gpg-agent.conf

在 OSS 点击 Close 之后出现错误

点击 Close 之后出错提示

如上图,构建行首的 Logo 上有一个红色的4,那就说明刚才的 Close 操作,验证没有通过;
点击之后,可以在下面下方的 Activity 中看到详细的错误,如下图:

查看错误详情

解决方案

其中每一次Close操作都会触发一次校验,校验有很多项,例如签名,POM 文件是否合法,是否包含源代码等等;齿轮是绿色的代表验证通过的项,红色的代表失败的验证项,点击可以查看具体失败的详细信息,对号入座解决问题即可,修改后重新 deploy 上来重复以上操作。

例如上图中,我的 pom 文件中缺少了 Project URL,验证没有通过;

执行 Close 出现 Failed: Signature Validation

验证构建文件签名失败

解决方案

恭喜你,你跟我一样遇到这个麻烦的问题,使用 brew 安装的 GPG 明明上传了公钥,查询查询到了,倒是 sonatype 就是报找不到对应的秘钥;那怎么解决呢;这个应该确认还是没有上传成功的,只是我感觉上传成功了。

这个时候,我是这么解决的,到 https://gpgtools.org/ 上下载了macOS 版本的 GPG Suite Tools客户端工具,安装好之后,打开 GPG Keychain ,这是你可能会直接看到刚才生成的 GPG 秘钥被列出来,你只需要选中,然后右键选中 Send Public to Key Server,接着等待3-5秒,弹出提示 successfully,这一次是真的上传成功了;再次重复 deploy=》Close 操作,你会发现,很快就验证通过了,赶紧去点击 Release 发布吧,谢谢。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容