从Github发布jar包到Maven Central

除非你的项目是Apache或者Codehaus管理的,否则你是不可能直接把artifacts发布到Maven Central的。然而,Sonatype提供了它们的Nexus repositories,我们可以将开源项目提交上去,然后会自动同步到Maven Central。

下面介绍下如何做:

准备工作

1.添加source code management信息到pom.xml:

1
2
3
4
5
<scm>
<connection>scm:git:git@github.com:blueshen/ut-maven-plugin.git</connection>
<developerConnection>scm:git:git@github.com:blueshen/ut-maven-plugin.git</developerConnection>
<url>git@github.com:blueshen/ut-maven-plugin.git</url>
</scm>

2.创建GPG的密钥对并发布公钥。参看Sonatype documentation的具体步骤。推荐使用Linux,Mac来发布。

gpg --gen-key 创建key
gpg --list-keys 查看所有的key
gpg --send-keys --keyserver pool.sks-keyservers.net yourkey 发布你的key到常见服务器上,如果出现找不到key的话,多发几个服务器

3.确保你的工程POM符合要求
4.创建一个Sonatype JIRA账户,并发布一个ticket来让Nexus repository建立。用户名,密码后面要用的。这中间牵涉到人工操作,会花费一些时间。

使用Maven来发布到Sonatype Nexus repository

pom.xml配置有2种方法:

1.添加maven-release-plugin到pom.xml:

1
2
3
4
5
6
7
8
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.2.2</version>
<configuration>
<arguments>-Dgpg.passphrase=${gpg.passphrase}</arguments>
</configuration>
</plugin>

添加Sonatype repositories:

1
2
3
4
5
6
7
8
9
10
11
12
<distributionManagement>
<snapshotRepository>
<id>sonatype-nexus-snapshots</id>
<name>Sonatype Nexus snapshot repository</name>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>sonatype-nexus-staging</id>
<name>Sonatype Nexus release repository</name>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>

设置artifact signing:

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
<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.4</version>
<configuration>
<passphrase>${gpg.passphrase}</passphrase>
</configuration>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>

2.直接添加sonatype parent到pom.xml

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

maven settings.xml配置

编辑或者创建~/.m2/settings.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
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>sonatype-nexus-snapshots</id>
<username>myusername</username>
<password>mypassword</password>
</server>
<server>
<id>sonatype-nexus-staging</id>
<username>myusername</username>
<password>mypassword</password>
</server>
</servers>

<profiles>
<profile>
<id>sign</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<gpg.passphrase>mypassphrase</gpg.passphrase>
</properties>
</profile>
</profiles>
</settings>

Maven有一个避免使用明文的方法

准备一个release版本

为了准备一个release版本, 执行:

$ mvn release:clean
$ mvn release:prepare

参考这个.这里具体做了以下工作:如果你的工程的版本是0.1-SNAPSHOT. 准备一个发布版本会去掉-SNAPSHOT后缀,然后提交到github,并将这时的代码打一个tag。同时,更新本地项目到0.2-SNAPSHOT版本.

如果你要撤销release,可以使用git reset --hard HEAD~2进行回退,使用git tag -d ut-maven-plugin-0.1删除Tag,然后使用git push origin :refs/tags/ut-maven-plugin-0.1提交.

发布到Sonatype

1.如果一切OK,你就可以使用mvn release:perform来发布工程到Sonatype。
2.登录到Sonatype Nexus,在Staging Repositories找到你的artifacts。
3.点击close,关闭后,点击Release发布artifacts。Sonatype有一些很好的指引. 你可以使用Maven repository management plugin来自动化这些步骤,尽管我自己还没有试过。
4.在你的JIRA ticket下添加一个评论,说你已经推了release版本。下次Sonatype同步的时候,就会将你的artifacts放到Maven Central了。以后再发布新版本的时候,就不用添加评论了,会自动同步的。

5.一旦你的jira申请已经OK,如果你再发顶级目录的其他artifact也是不需要再走jira流程了。

参考文档http://datumedge.blogspot.jp/2012/05/publishing-from-github-to-maven-central.html