开源:上传 Jar 包至 Maven 中央仓库

2022-12-01 16:05:02 浏览数 (1)

前言

最近我将服务发现组件开源了:cloud-discovery,分享一下 Jar 包上传中央仓库过程遇到的问题与总结。需要说明的是,在下面两篇文章中已经将步骤写的非常清楚了,本文主要记录的是我在操作过程中遇到的一些坑,以供参考。

开源地址

  • • cloud-discovery:https://github.com/studeyang/cloud-discovery

参考文章

  • • https://juejin.cn/post/7130363900813377567
  • • https://juejin.cn/post/7089301165929660446

Sonatype Jira 账号注册

首先你要申请 groupId,例如 Spring 的 groupId 是org.springframework。你也要申请自己的 groupId,这个很好理解,毕竟org.springframework有很强的权威性,不是谁都能上传的。

groupId 就是在 Sonatype Jira 平台申请的。

第一,注册/登录账号

注册地址:https://issues.sonatype.org/secure/Signup!default.jspa

登录地址:https://issues.sonatype.org/login.jsp

第二,创建问题

创建问题

注意「项目」要先择「Community Support - Open Source Project Repository」,「问题类型」选择「New Project」。

已创建问题

等待审核人员审核通过。

审核记录

上图Congratulations!Welcome to the Central Repository!,说明 groupId 已经申请通过了,通常你命名的格式是:io.github.{你的github用户名},基本上都能一次性申请通过。

接着,按照下面的文档操作就可以了。

代码语言:javascript复制
https://central.sonatype.org/publish/publish-guide/#deployment
https://central.sonatype.org/publish/release/

Pom.xml 配置

接下来就要配置项目打包相关的信息了,在 pom.xml 文件里,需要额外加上下面的配置项,否则配置信息校验会不通过。

代码语言:javascript复制
<name>,<description>,<url>,<licenses>,<scm>,<developers>

另外也会校验文档文件xx-javadoc.jar和加密文件xx.jar.asc。下面两个插件可以生成对应的文件。

代码语言:javascript复制
maven-javadoc-plugin,maven-gpg-plugin

nexus-staging-maven-plugin这个插件也简单介绍一下,Jar 包会先上传到 Staging Repository 仓库中,然后需要手动点击进行校验并通过后,才会到正式仓库。这个插件免去了手动点击的繁琐操作,直接进行校验。

完整的pom.xml配置可以参考我的 Github 工程:https://github.com/studeyang/cloud-discovery/blob/master/pom.xml

Jar 包加密传输

Maven Pom 配置好后,你不能直接通过 mvn deploy命令将 Jar 包传输到中央仓库,而是要经过加密软件的加密。

安装GnuPG软件

下载地址:https://gpg4win.org/thanks-for-download.html

(步骤一)这个软件是为了给要上传的 Jar 包加密用。使用gpg --gen-key命令生成密钥。

代码语言:javascript复制
C:UsersAdministrator>gpg --gen-key
gpg (GnuPG) 2.3.8; Copyright (C) 2021 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name: yanglulu
Email address: yanglu_u@126.com
You selected this USER-ID:
    "yanglulu <yanglu_u@126.com>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit?

输入「o」回车。

代码语言:javascript复制
Change (N)ame, (E)mail, or (O)kay/(Q)uit? o
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: directory 'C:\Users\Administrator\AppData\Roaming\gnupg\openpgp-revocs.d' created
gpg: revocation certificate stored as 'C:\Users\Administrator\AppData\Roaming\gnupg\openpgp-revocs.d\6381681E82726235773B17D753A149DCE9EE4910.rev'
public and secret key created and signed.

pub   ed25519 2022-11-07 [SC] [expires: 2024-11-06]
      6381681E82726235773B17D753A149DCE9EE4910
uid                      yanglulu <yanglu_u@126.com>
sub   cv25519 2022-11-07 [E] [expires: 2024-11-06]

(步骤二)使用gpg --list-key查看生成结果。

代码语言:javascript复制
C:UsersAdministrator>gpg --list-key
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2024-11-06
C:UsersAdministratorAppDataRoaminggnupgpubring.kbx
--------------------------------------------------------
pub   rsa4096 2021-10-25 [SC] [expires: 2025-10-25]
      1121AFDE66C7246282A7610448CB2369E978B6BA
uid           [unknown] yanglulu <yanglu_u@126.com>
sub   rsa4096 2021-10-25 [E] [expires: 2025-10-25]

pub   ed25519 2022-11-07 [SC] [expires: 2024-11-06]
      6381681E82726235773B17D753A149DCE9EE4910
uid           [ultimate] yanglulu <yanglu_u@126.com>
sub   cv25519 2022-11-07 [E] [expires: 2024-11-06]

踩坑1:使用错误的公钥加密文件,导致上传仓库失败

(步骤三)接着上面的步骤,把公钥发送到hkp://keyserver.ubuntu.com:11371服务器。

代码语言:javascript复制
C:UsersAdministrator>gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 1121AFDE66C7246282A7610448CB2369E978B6BA
gpg: sending key 48CB2369E978B6BA to hkp://keyserver.ubuntu.com

看一下公钥的发送结果。

代码语言:javascript复制
C:UsersAdministrator>gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys 1121AFDE66C7246282A7610448CB2369E978B6BA
gpg: key 48CB2369E978B6BA: "yanglulu <yanglu_u@126.com>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1

(步骤四)公钥发送成功了,下面打 Jar 包。

代码语言:javascript复制
D:githubcloud-discovery>mvn -U clean deploy -P release

到这一步,出错了。

问题

从提示来看,似乎是没有找到公钥,但是「步骤三」显示,我分明已经将公钥发送过去了,有点奇怪!

我们从「步骤一」再仔细捋一遍,找找问题的线索:

  • • 步骤一生成了两个密钥,一个 uid 标识为 [unknown],另一个标识为 [ultimate]
  • • 步骤三我把标识为[unknown]的公钥发了出去,并提示我 key 48CB2369E978B6BA 发送成功
  • • 步骤四的报错原因显示,53a149dce9ee4910 这个 key 找不到

会不会是 uid 标识为 [unknown] 的密钥有问题呢?

后来我尝试使用 [ultimate] 的公钥重新发送。

代码语言:javascript复制
D:githubcloud-discovery>gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 6381681E82726235773B17D753A149DCE9EE4910
gpg: sending key 53A149DCE9EE4910 to hkp://keyserver.ubuntu.com:11371
代码语言:javascript复制
D:githubcloud-discovery>gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys 6381681E82726235773B17D753A149DCE9EE4910
gpg: key 53A149DCE9EE4910: "yanglulu <yanglu_u@126.com>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1

结果显示 key 53A149DCE9EE4910 发送成功了,并且 53A149DCE9EE4910 也与报错中找不到的 key 吻合。我再进行后面的步骤,这个问题果然就不出现了。

踩坑2:401错误

继续后面的步骤,在mvn deploy过程中返回了一个 401 错误码,这个问题原因就是 ossrh 账号密码配错了。

天真的我以为自己账号密码记得非常清楚,不会有错,尝试其他修改无果后,校验了一下密码,果然是密码写错了。TT

踩坑3:--recv-keys No data

补充一下,在踩坑1发送公钥步骤中,会出现下面的响应,这时再重试发送一次就好了。

代码语言:javascript复制
D:githubcloud-discovery>gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys 6381681E82726235773B17D753A149DCE9EE4910
gpg: keyserver receive failed: No data

上传成功后,可以在https://s01.oss.sonatype.org/查询到 Jar 包,此时就已经可以供用户下载了,同步至中央仓库还没有这么及时。

oss

过两天再从中央仓库查询,Jar 包已经可以查到了。

maven仓库

中央仓库地址是:https://mvnrepository.com/

小结

整个过程看起来容易,做起来就会遇过各种各样的问题。想要公开自己 Jar 包的小伙伴赶紧操作起来吧!

0 人点赞