发布开源项目到Maven Central

目录 [−]

  1. 总体路线概述
  2. 申请账号并提交Ticket
  3. 规范POM
  4. 配置PGP
  5. 发布SNAPSHOT版本
  6. 发布Staging版本
  7. 正式发布
  8. 总结
  9. 参考资料
  10. 编译上传
    1. (1) 发布一个snapshot版本发布一个snapshot版本
    2. (2) 发布一个release版本
  11. 正式发布

最近准备将新开发的一个项目fastjson-jaxrs-json-provider发布的Maven central repository中(sonatype respository), 这样其它人可以方便的下载编译好的库使用。 具体步骤可以参考官方文档

搜索了一下,发现阿里的王福强的一篇文档介绍的很详细,特此转载记录以下。

原文地址: 发布开源项目到Maven Central

过程比较繁琐曲折,其实按照官方文档一步一步做,大部分情况下是可以搞定的, 不过,为了方便后面查阅,简单整理为此文档。

总体路线概述

直接发布到central repo其实是不行的,所以,其实我们是发布到sonatype的repository, 然后sonatype的repository会定期把我们的artifacts同步到maven的central repo中。

基本上,如果我们的项目是第一次发布到sonatype,那么需要申请一个账号,并提交New Project的Ticket等待审批,审批之后,就可以开始准备发布项目所需的各项要求了。当然,因为Ticket审批需要2个工作日,那么,其实可以在这段时间就把准备工作做掉。

初次发布,POM文件需要规范为sonatype要求的格式,该添加的element还是要添加一下,另外, 因为需要对要发布的artifacts做签名,也需要安装一下GnuPGP,并将public key上传到指定的key server上去(hkp://pool.sks-keyservers.net), 并在.m2/settings.xml中添加相应的passphrase配置。

所有这些事儿搞定之后,就可以执行命令开始发布, 总体流程大体如此。

申请账号并提交Ticket

这一步没啥难度,参考官方文档的说明即可:

  1. https://issues.sonatype.org/申请账号
  2. 到通过'+Create Issue'创建新的Ticket, 类型为New Project, 其它信息按照人家要求填写就行了
    Ticket提交完了就等着就好了,人家说了要2个工作日才能审批完成,运气好估计会快点儿吧, 偶第一次因为SB网速,提交了2个相同的Ticket...

规范POM

这些element人家说了,必须要:

1
2
3
4
5
6
7
8
9
10
11
12
<modelVersion>
<groupId>
<artifactId>
<version>
<packaging>
<name>
<description>
<url>
<licenses>
<scm><url>
<scm><connection>
<developers>

另外, 除了二进制jar包,相对应的-sources.jar和-javadoc.jar也是必须的,所有这些jar以及pom.xml都需要通过PGP签名,所以,我们需要在pom.xml里添加相应的maven插件来帮助我们搞定这些:

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
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<charset>${file_encoding}</charset>
<encoding>${file_encoding}</encoding>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>

我们不想任何时候都做pgp签名,这样会比较耗费时间,一般只是在发布的时候才执行pgp前面,所以,我们将maven的pgp插件放入pom.xml里单独的一个profile中:

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
<profiles>
<profile>
<id>release-sign-artifacts</id>
<activation>
<property>
<name>performRelease</name>
<value>true</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>

除此之外, 我们的pom应该继承自sonatype oss:

1
2
3
4
5
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>7</version>
</parent>

并且,有关SCM的信息需要严格填写, maven将在发布的时候自动checkout并打标发布。

配置PGP

如果发布机上没有安装,需要安装一下, 俺本地因为是mac,所以直接下了pgptools,一键安装, very easy~

安装后,创建一个pgp key,并发布到指定的key server - hkp://pool.sks-keyservers.net, 因为pgptools默认是发布到gnu的key server,所以,需要在PGP Keychain Access.app的Preferences里将key server选择为hkp://pool.sks-keyservers.net

所有这些搞定之后,在~/.m2/settings.xml中添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<settings>
...
<servers>
<server>
<id>sonatype-nexus-snapshots</id>
<username>your-jira-id</username>
<password>your-jira-pwd</password>
</server>
<server>
<id>sonatype-nexus-staging</id>
<username>your-jira-id</username>
<password>your-jira-pwd</password>
</server>
</servers>
...
</settings>

用户名和密码在一开始已经申请过了,填上即可。

更详细步骤参看 https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven

发布SNAPSHOT版本

1
$ mvn clean deploy

发布Staging版本

1
2
3
$ mvn release:clean
$ mvn release:prepare
$ mvn release:perform

期间会提示需要输入pgp key的passphrase,照办就是了。
哥的Ticket当天没批下来,所以,运行会告诉我没有权限上传artifacts:

1
2
3
4
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.5:deploy (default-deploy) on project cobar-client:
Failed to deploy artifacts: Could not transfer artifact com.alibaba.cobar:cobar-client:jar:1.0.5 from/to
sonatype-nexus-staging (https://oss.sonatype.org/service/local/staging/deploy/maven2/):
Access denied to: https://oss.sonatype.org/service/local/staging/deploy/maven2/com/alibaba/cobar/cobar-client/1.0.5/cobar-client-1.0.5.jar -> [Help 1]

没办法,等吧~

正式发布

访问web地址: https://oss.sonatype.org/

登陆, 选择左边栏里的"Staging Repositories", 然后点Close按钮,sonatype会做响应的validation,通过的话,就可以点Release发布啦,如果不通过,或者人工检查有问题,就先Drop,并重新做Staging发布, 知道搞定之后,再行发布。 没Release之前随便搞, Release之后就板上钉钉了。

总结

第一次搞需要拢的东西比较多,而且很久没搞Maven了(俺现在搞SBT比较多,u know的), 所以,搞的期间偶尔出点儿小问题刺挠刺挠我,都是小事儿,总体上来讲, 官方文档还是比较靠谱的。

参考资料

  1. 官方文档
  2. http://datumedge.blogspot.com/2012/05/publishing-from-github-to-maven-central.html
  3. https://docs.sonatype.org/display/Repository/How+To+Generate+PGP+Signatures+With+Maven

第一次发布有些周折, 请参看另外一篇文章: 上传Android或Java库到Maven central repository:

前面的步骤都一样, 下面转载后面几个章节。

编译上传

(1) 发布一个snapshot版本发布一个snapshot版本

mvn clean deploy
发布完成后登陆https://oss.sonatype.org (https://issues.sonatype.org/ 上的用户名和密码),通过下图步骤找到自己的Artifact(上传的jar或aar或pom等)

(2) 发布一个release版本

mvn release:clean release:prepare release:perform

过程中需要通过GPG签名,需要输入上面的passphase。发布完成后我们依然可以通过类似上图步骤找到我们的Artifact

其他上传方式见Stage a Release

正式发布

这里的正式发布是指同步到Maven主仓库使得其他人可以使用。主要包括Close和Release两步,先Close后Release,分别如下图

其他不明白可以查看:Release

需要注意

(1) 在release时可能会出现

1
2
Release failed
Nexus returned an error: ERROR 403: Forbidden

的403弹窗,这可能是因为在2中创建的JIRA ticket,状态还没有变为 resolved,等待可用即可。如果上面截图中你的Repository列表中Profile列的值不是你在创建JIRA ticket时的Group Id需要重新提交。

(2) 如果是第一次release,需要到之前你的JIRA ticket下,评论下告诉他们,你已经release了,需要同步下,我的JIRA ticket: OSSRH-9800. 如下图:


另一篇:
将项目发布到Maven中央库

如果发布时出现401认证错误,检查settings.xml文件中是否为oss的仓库设置了用户名和密码:http://stackoverflow.com/questions/24830610/why-am-i-getting-a-401-unauthorized-error-in-maven


我的经验:以后发布只需

$ mvn release:clean
$ mvn release:prepare
$ mvn release:perform

然后在https://oss.sonatype.org上点击close,release就发布新的版本了

评论