如何将artifact发布到Maven中央仓库
1. 背景
最近写了一个分布式锁组件,并在另一个项目中引用了该组件。由于组件lib没有发布到远程仓库,导致每次环境变更,我都要将该分布式组件代码拉下来,然后install到本地Maven仓库,非常麻烦。因此,趁周末决定学习下如何发布到远程的中央仓库,并通过该博文来对整个过程做一个分享。
2. 正文
要将artifact发布到Maven中央仓库,只需要按以下4个步骤走:
- 在sonatype.org上注册账号
- 申请pom.xml内使用的groupId的所有权,申请地址点这里
- 构建项目并部署到“OSSRH Nexus Repository Manager”
- 发布版本到中央仓库
2.1 注册账号
- 点击sonatype.org进入账号注册页面并填写你的信息:
之后会收到一封注册成功的通知邮件:
2.2 申请groupId的所有权
- 在能够将指定groupId的artifact发布到中央仓库前,必须申请获得groupId的所有权。申请表单链接在这里,表单内容可按如下填写:
- 表单提交后会生成一个issue页面,几分钟后刷新页面,会看到有机器人回复:
主要内容是让你加一条解析记录到正在申请所有权的域名下,比如我的域名注册商是腾讯云,以下是我按要求添加的解析记录:
- DNS解析记录添加完毕,回到issue界面,回复一个内容,表单状态会自动由”Waiting for response”变回”open”:
几分钟后能收到groupId授权成功的回复,此时groupId的已经正式可用:
2.3 构建项目并部署到“OSSRH Nexus Repository Manager”
- 在settings.xml中配置远程仓库服务器信息:
- 在项目的pom.xml中配置使用的远程仓库信息:
1
2
3
4
5
6
7
8
9
10
11<distributionManagement>
<snapshotRepository>
<!-- 对应settings.xml内配置的<server>下的id -->
<id>ossrh</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
在项目的pom.xml中配置需要用到的插件信息:
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
53
54
55
56
57
58
59
60
61
62
63
64<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<!-- 生成源码 jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 生成javadoc jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- gpg 签名 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- nexus 组件发布 -->
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>false</autoReleaseAfterClose>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>安装gpg4win,下载地址,使用下图中命令生成key,生成过程会让输入Passphrase,输入后把它记下来,后面会用到
- 在settings.xml中配置上一步安装的gpg可执行文件的路径以及生成的Passphrase:
- 上传生成的秘钥对的公钥:
1
2
3
4
5
6# 查看当前本机保存的秘钥
gpg --list-signatures --keyid-format 0xshort
# 上传公钥到服务器
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys [你的公钥id]
# 查看公钥是否上传成功
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys [你的公钥id]
- 在项目的pom.xml文件内添加项目名,项目描述,项目URL等信息,否则,构建会失败,如下图。具体配置可参考这里
- 执行命令
mvn clean deploy -P release,如下图所示则表示构建成功,如果构建失败,可以加入-e参数查看更多的错误信息,如mvn clean deploy -P release -e
- 完事后,回到你的issue页面刷新,能收到一个机器人的自动回复,意思是发布artifact后,就能在maven的中央仓库中看到我们的artifact了:
2.4 发布版本到中央仓库
- 点击此链接登录Nexus查看构建结果:
- 发布构建结果
- 发布后状态变为closed:
- 等十几分钟,然后到这里可以搜到我们发布的jar,此时整个过程完事:
- 如果想自动发布,不走2.4中的第2和第3步,那么可以将
nexus-staging-maven-plugin这个插件的<autoReleaseAfterClose>属性改为true,此时构建,打包完成后会自动release,无需手动去点:
3. 参考资料
- Deploying to OSSRH with Apache Maven
- Releasing Deployment from OSSRH to the Central Repository
- How to publish artifacts on maven central
- 演示的项目地址为:hellooo-distributedlock,一个Redis下的分布式锁组件实现,欢迎star,共同交流学习!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 杰布是谁!