如何将 Jar 包发布到 Maven 仓库

流程简述

  1. 创建 Issue
  2. 等待审核
  3. 配置 Maven 并修改 pom.xml
  4. 发布项目
  5. 回复“项目已发布”信息
  6. 等待 Maven 仓库同步信息(需等待很长时间)
  7. 在 Maven 仓库中确认已发布的项目

登录/创建 Sonatype

访问 Sonatype 官网,登录或创建一个用户。
Sonatype Login

新建一个 Issue

在 Dashboard 页面,点击 “Create” 按钮。
Sonatype Dashboard

按照提示新建一个 Issue。例如:
Create Issue
注意:

  • Group Id 要符合命令规范,即域名的倒序,还要保证其唯一性。(最好有自己的独立域名,一级域名或二级域名都行)
  • 在创建 Issue 时,Project URLSCM url 虽然是必填项,但如果你的项目还没有上传,还没有项目地址和 Git 地址,此处可以先填写一个临时的 URL 不需要一定能被访问,以后还可以修改该值。

查看新建的 Issue

创建完 Issue 后,可以通过 Issues -> Reported by me 查看 Issue 审核状态。
View Issue-1
View Issue-2
上面这个截图已经是我审核通过后的状态,如果你是刚刚新建的 Issue,那么其中的 StatusResolution 和我这个是不一样的。具体是什么当时忘截图了,应该显示是未处理状态。

等待审核新创建的 Issue 并回复信息

通常在你提交完 Issue 之后的几分钟内,就会有人审核你的提交信息,并对你的提交 进行回复,确认你是否拥有所填写的域名。例如:
First Review Issue

此时你需要回复信息,表明你拥有该域名即可。回复完信息后,一两个小时内,你会再次收到对方的回复,告诉你创建的 Issue 已经通过审核了,你可以发布你的项目了。例如:
Second Review Issue

例外,对方的回复中还要求你在发布项目之后,需要回复一下信息,告诉对方你已经发布了项目。你只需要简单的回复下即可。例如:”I have promoted my first release. Thanks.”

配置 Maven 并修改 pom.xml

使用 GPG 生成密钥对

以 CentOS7 为例,说明如何生成 GPG 密钥对。
使用如下命令生成密钥对(基本一路回车就行,最后会要求输入两次 Passphase,这个千万不能忘,发布项目时会用到):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥种类:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
您的选择?
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)
您所要求的密钥尺寸是 2048 位
请设定这把密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)
密钥永远不会过期
以上正确吗?(y/n)y

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

真实姓名:Michael Leo
电子邮件地址:y@ho1ho.com
注释:GPG for Leo
您选定了这个用户标识:
“Michael Leo (GPG for Leo) <y@ho1ho.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?O
您需要一个密码来保护您的私钥。

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 密钥 <your key id> 被标记为绝对信任
公钥和私钥已经生成并经签名。

gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性: 1 已签名: 0 信任度:0-,0q,0n,0m,0f,1u
pub 2048R/<your key id> 2018-03-26
密钥指纹 = <your key fingerprint>
uid Michael Leo (GPG for Leo) <y@ho1ho.com>
sub 2048R/<your key id> 2018-03-26

生成的所有文件保存在/root/.gnupg/目录下。你也可以将把拷贝到其它中机器在使用,但是要注意该文件夹的权限应该是“700”。

需要记下 gpg: 密钥 <your key id> 被标记为绝对信任 中的 <your key id>,一会要用到。

可以使用如下命令查看生成的 Keys:

1
# gpg --list-keys

发布生成的 Key

使用如下命令发布生成的 Key:

1
2
# gpg --keyserver hkp://pool.sks-keyservers.net --send-keys <your key id>
gpg: 将密钥‘<your key id>’上传到 hkp 服务器 pool.sks-keyservers.net

上面的结果是第二执行的结果。(第一次执行的结果忘保存了…)
注意:
由于众所周知原因,上述服务器地址通常是无法访问的,因此执行这一步时,需要稳定的科学上网环境。根据经验,凡是这一步出错的,基本上都是上网方式不对导致了。

另外,建议你同时将你的 Key 发布到其它几个常用的服务器,这样可以加速 Key 的同步过程。其它常用服务器有:

  • pgp.mit.edu
  • keyserver.ubuntu.com

查看 Key 是否上传成功

1
2
3
4
# gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys <your key id>
gpg: 下载密钥‘<your key id>’,从 hkp 服务器 pool.sks-keyservers.net
gpg: 密钥 <your key id>:“Michael Leo (GPG for Leo) <y@ho1ho.com>”未改变
gpg: 合计被处理的数量:1

成功执行完上一步的命令之后,服务器会将你的 Key 同步到其它服务器,因此可能需要等上几分钟才能收到上传成功的结果。

修改 Maven 全局配置文件

此步骤需要修改 Maven 安装目录下的 settings.xml 文件。由于我的 Maven 是通过 yum 安装的,因此我需要修改如下文件:

1
# vim /usr/share/maven/conf/settings.xml

找到<servers>节点,并追加如下内容:

1
2
3
4
5
<server>
<id>ossrh</id>
<username>Sonatype user id</username>
<password>Sonatype user password</password>
</server>

其中 id 的值可以任意设置,只要保证它在 <servers> 的唯一性就行。请记住该 id 值,以后会用到。
<username><password> 就是你登录 Sonatype 的用户名及密码。

修改 pom.xml 文件

Maven 仓库对 pom.xml 有着严格的要求,需要很多元信息:

名称及版本信息

  • groupId
  • artifactId
  • version

项目信息

  • name
  • description
  • url

版权信息

  • licenses

开发者信息

  • developers

SCM 信息

  • scm

详细说明请查看官网指南

注意:
根据官网指南要求,version 不能-SNAPSHOT 结尾,因为它是为了标识处于开发状态用的保留字。并建议你使用语义化的version。规则如下:MAJOR.MINOR.PATCH

下面是我的完整 pom 文件

官网完整 pom 文件示例如下:
https://github.com/simpligility/ossrh-demo/blob/master/pom.xml
https://bitbucket.org/simpligility/ossrh-pipeline-demo/src

特别注意:
通常修改 pom.xml 时,还会添加一些常用的插件,例如源代码插件,Javadoc 插件等。这就要求你的 Java 代码中,若使用了 Javadoc,请务必符合 Javadoc 规范。否则发布时会报错的。

另外,nexus-staging-maven-plugin 插件配置项目中的 serverId 需要和之前修改的 settings.xml 文件中 <server><id> 相同。详见我的完整 pom 文件

发布项目

经过上述步骤后,就可以执行如下命令发布你的项目了:

1
mvn clean deploy -Dgpg.passphrase=<Your passphrase>

其中 passphrase 就是生成 GPG 密钥对时,输入的 passphrase
最后执行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 1 modules...
[INFO] Installing Nexus Staging features:
[INFO] ... total of 1 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building spring-boot-web-framework 1.0.0
[INFO] ------------------------------------------------------------------------
Downloading: https://repo.spring.io/milestone/com/fasterxml/jackson/dataformat/jackson-dataformat-csv/2.9.4/jackson-dataformat-csv-2.9.4.pom
Downloading: https://repo.spring.io/snapshot/com/fasterxml/jackson/dataformat/jackson-dataformat-csv/2.9.4/jackson-dataformat-csv-2.9.4.pom
......
......
[INFO] * Upload of locally staged artifacts finished.
[INFO] * Closing staging repository with ID "comho1ho-1001".

Waiting for operation to complete...
.......

[INFO] Remote staged 1 repositories, finished with success.
[INFO] Remote staging repositories are being released...

Waiting for operation to complete...
..........

[INFO] Remote staging repositories released.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2:00.420s
[INFO] Finished at: Mon Mar 26 16:53:10 CST 2018
[INFO] Final Memory: 41M/121M
[INFO] ------------------------------------------------------------------------

看到 BUILD SUCCESS 就说明发布成功了。

注意:
如何由于更换电脑等原因,导致发布时报如下错:

1
2
gpg: 签名时失败: Inappropriate ioctl for device
gpg: signing failed: Inappropriate ioctl for device

解决办法如下。
新建或修改如下文件:

1
vim ~/.gnupg/gpg.conf

添加如下内容:

1
2
use-agent 
pinentry-mode loopback

然后,再新建或修改如下文件:

1
vim ~/.gnupg/gpg-agent.conf

添加如下内容:

1
allow-loopback-pinentry

回复“项目已发布”信息

之前已经提到了,发布成功之后,别忘了在 Sonatype 上回复一下。例如: ”I have promoted my first release. Thanks.”

在你回复之后,用不了多长时间(一二十分钟吧),你会收到对方的答复信息:
Final Review Reply

通常 10 多分钟你的项目就会被发布到 Maven Central,不过一般需要等上几个小时,才能官网上搜索到你发布的项目。以我为例,至少花了 4 个小时。

在官网上对发布的项目进行确认

经过漫长的等待,你最终可以在 Maven Central 上搜索到自己的项目了。
ho1ho project in maven - 1

同时在仓库中也可以可以搜索到自己的项目了。
ho1ho project in maven - 2

坚持原创及高品质技术分享,您的支持将鼓励我继续创作!