Depoly your own maven lib/plugin to Maven Central Repository

最近提交了自己写的一个maven插件到官方Maven Central Repository:http://search.maven.org/#browse%7C1637367917,前后花了三四天时间。花这么多天并不是说这个事情有多麻烦,只是期间不得不有停顿,你没办法一气儿做好。

起因

因为是一个挺简单的插件,所以其实最开始并没想着搞这么复杂。参照着http://stackoverflow.com/questions/14013644/hosting-a-maven-repository-on-github, 在GitHub上Host了一个repository。任何一个想用这个plugin的人只需要在自己的pom.xml里加上一个pluginRepository就可以了:

[xml]
<pluginRepositories>
<pluginRepository>
<id>swagger-maven-plugin-mvn-repo</id>
<url>https://github.com/kongchen/swagger-maven-plugin/raw/mvn-repo/</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>
[/xml]

项目放上去后也就没再管过,直到有天突然发现一大堆人抱怨说用的时候maven找不到插件,折腾了一圈发现原来是自己不慎,在写README.md时把pluginRepository写成了repository

在issue的抱怨里有人说你不如搞一个放在Maven Central Repo里,免得让人有额外的配置。
想想这么多人抱怨,至少说明还有人想用,就搞一下吧。

过程

其实参照

https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide

参照这个guide,任何人都能很方便的做到这个事情。这里简单再复述一下,顺带提示一些我遇到的小陷阱。

准备

这里推荐本地开发环境使用Mac或者Linux

因为在GPG, git这些tool在处理windows路径上做的不够好,会有些莫名其妙的bug。比如git push的时候莫名其妙的卡住,gpg说public key文件找不到等等。在这些事情上浪费时间实在划不来。

下面这些tool也是必须的:

注册Sonatype OSSRH (OSS Repository Hosting Service)账号

我们八成的工作需要借助Sonatype提供给我们的平台来完成,所以注册账号是必须的。

在OSSRH提交一个JIRA ticket,表示你打算创建一个Repository

这一步问题不大,需要的只是时间等人来帮你处理。按照Guide里的把该填的都填对,很快就会有人给你解决。

开头说我做这个事情花了三四天时间,就是因为这一步让我有了停顿,人家那边JIRA其实早给我处理了,但我隔了两天才开始接着搞下面的事情:

开始

首先要把你的pom完善起来,需要填写的有:

  • <modelVersion>
  • <groupId>
  • <artifactId>
  • <version>
  • <packaging>
  • <name>
  • <description>
  • <url>
  • <licenses>
  • <scm><url>
  • <scm><connection>
  • <developers>

上面这些是Guide里列出来的,实际使用时我发现还得正确配置<scm><developerConnection> 否则maven的release插件会在relase:prepare阶段出错,原因是它默认选择svn去check in它改动过的pom.xml而全然不顾我们的项目是git的。

因为Guide里的配置是svn,而我是git。这里share一下我的scm部分的配置:

[xml]
<scm>
<connection>scm:git:git@github.com:kongchen/swagger-maven-plugin.git</connection>
<url>scm:git:git@github.com:kongchen/swagger-maven-plugin.git</url>
<developerConnection>scm:git:git@github.com:kongchen/swagger-maven-plugin.git</developerConnection>
</scm>
[/xml]

接下来就是按照Guide里章节7a去做了。

如果你只想部署到Sonatype的snapshot repo,参照7a.1和7a.2就可以了。但如果想同步到Central Repo,就需要参照7a.3 Stage a Release先Stage一个Release出来。

Stage a Release说白了就是三步

[bash]
$ mvn release:clean
$ mvn release:prepare
$ mvn release:perform
[/bash]

但这三步想一次成功也不太容易。

  • 首先必须保证本地代码库跟SCM上up to date。
  • 其次,本地的pom里的version必须是个SNAPSHOT。

假设你希望Central Repo里面发布1.1版本,那此时此刻你pom.xml里必须是1.1-SNAPSHOT。
而mvn release:prepare会做这样2件事情:

1. 把你pom.xml里的version中的SNAPSHOT去掉,比如原来是1.1-SNAPSHOT,它会给改成1.1
2. 将改好的pom.xml提交到SCM。针对于git,就是commit + push.
  • 最后的mvn relase:perform则是基于prepare的结果,把相关文件提交到Sonatype的release仓库。这里就会用到你的GPG key。

三步中任何一步中的任一个步骤出错都需要重来。比较折腾人的是如果pom.xml里version已经被mvn release:prepare从1.1-SNAPSHOT改成了1.1并push上了git server。重来就意味着得把这里再改回来,不然prepare过不了。你光改本地的还不行,因为prepare会抱怨你本地的跟git server上的不一致,也过不了。

这三步成功之后,事情还没有结束,还有三步需要做。

  1. 登陆Nexus UI, 找到刚刚stage成功的包
  2. Close这个repo。如果之前的操作都没问题,close才会成功。否则你会看到一些失败,通常是pom里有些东西配置错误,或者GPG key有问题等等。
  3. Close成功后,就可以点击Release按钮Release了。在此之前,Release按钮都是灰化的。

这三步完成之后,就真的只剩最后一步了。

搞定

回到你最开始创建的JIRA ticket里,加一个comment说你已经release了,希望能够被sync到Central Repo。

之后如果没什么意外的话,你的库就会出现在Maven Central Repository了。

这个事情只需做一次,以后包的更新只需要release成功,Sonatype会每两小时向Central Repo同步一次。

Written on May 17, 2013