将开源项目Deploy至Maven中央仓库

准备工作

你应该有一个GitHub账户以及托管在其中的Maven项目,当然使用GitlabBitBucket等也没有问题。

你应该有一个sonatype账户,我们最终需要通过此平台发布我们的Jar包等,这个账户在创建GroupID以及Deploy时候需要使用,如果你没有的话,可以直接使用邮箱到sonatype上面注册

你可以通过此链接创建自己的GroupID,你不需要为每个项目都创建一次GroupID,只需要创建一次即可重复使用。比如我的Github名称是sisyphsu,创建名为com.github.sisyphsuGroupID之后,就可以在不同的项目中重复使用,这些项目之间通过不同的artifactId进行区分。

你需要安装GPG用于Jar包的签名等,对于Mac系统可以直接通过brew安装:

1
➜  ~ brew install gpg

安装GPG且初始化私钥之后,你需要将本地的公钥发布至云端服务器中,因为sonatyperelease阶段需要请求这些公钥服务器验证你提供的Jar包签名。

1
2
3
4
5
6
7
8
9
10
➜  ~ gpg -k
......
-------------------------------
pub rsa2048 2019-04-17 [SC] [有效至:2021-04-16]
9B0F5BDF9B7D0FD27607......
uid [ 绝对 ] ...
sub rsa2048 2019-04-17 [E] [有效至:2021-04-16]

➜ ~ gpg --keyserver hkp://keyserver.ubuntu.com --send-keys 9B0F5BDF9B7D0FD276075AC06E91F179586C9822
gpg: 正在发送密钥 6E91F179586C9822 到 hkp://keyserver.ubuntu.com

配置settings.xml

将之前准备好的sonatype账户配置在全局Maven配置文件settings.xml中:

1
2
3
4
5
6
7
<servers>
<server>
<id>oss</id>
<username>******</username>
<password>******</password>
</server>
</servers>

注意id的值,后续的项目配置中需要依赖它。

配置项目

Maven项目本身的配置相对较多一些,即项目的pom.xml配置,你也可以直接参考我自己的一个项目

项目信息

公共仓库对项目的描述信息要求比较严格,类似namedescriptionurl等项目信息都必须明确配置,否则在release阶段会被拒绝。

除此之外,也需要配置issueManagementlicensesdevelopersscm等,具体实例如下:

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
<name>common</name>
<description>Some useful library for Java &amp; SpringBoot implementation.</description>
<url>https://github.com/sisyphsu/common</url>

<!-- ...... -->

<issueManagement>
<system>Github Issue</system>
<url>https://github.com/sisyphsu/common/issues</url>
</issueManagement>
<licenses>
<license>
<name>MIT License</name>
<url>https://github.com/sisyphsu/common/blob/master/LICENSE</url>
</license>
</licenses>
<developers>
<developer>
<name>sulin</name>
<email>sulinixl@gmail.com</email>
</developer>
</developers>
<scm>
<connection>scm:git@github.com:sisyphsu/common.git</connection>
<developerConnection>scm:git@github.com:sisyphsu/common.git</developerConnection>
<url>git@github.com:sisyphsu/common.git</url>
</scm>

发布配置

指定项目发布时的目标服务器,此处配置为sonatype服务器,最终会被收录入中央仓库。

注意此处的<id>oss</id>Maven会在Deploy过程中根据它到settings.xml中寻找认证信息。

1
2
3
4
5
6
7
8
9
10
<distributionManagement>
<snapshotRepository>
<id>oss</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>oss</id>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>

使用到的插件

我自己的项目中一般使用以下6个plugin

  • maven-compiler-plugin:常用的Java编译插件,可以指定版本及编码等。
  • maven-surefire-plugin:这是执行测试用例的默认插件,我一般显示声明它然后开启skipTests可选
  • maven-source-plugin:此插件可以将Java源代码额外发布为*-sources.jar可选
  • maven-javadoc-plugin:此插件可以生成javadoc并额外发布*-javadoc.jar可选
  • maven-gpg-plugin:此插件用来对Jar包等进行签名等,sonatype会验证你提供的签名,必选
  • nexus-staging-maven-plugin:由sonatype提供的可以自动执行closerelease流程的插件,可选

具体代码中的配置参考如下:

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.8</version>
<executions>
<execution>
<id>default-deploy</id>
<phase>deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
<configuration>
<serverId>oss</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
</plugins>

Deploy流程

发布流程已经被插件nexus-staging-maven-plugin封装好了,但是也可以手动操作,具体流程大概如下:

  1. 进入StagingRepositories,通过groupID中的关键词搜索自己发布的库。
  2. 起始状态应该是active,选中后执行Close操作,个人理解相当于封版。
  3. close状态的库执行Release操作,执行完成后就会发布至延迟发布至中央仓库中。

如果过程中出现错误,可以在页面下方的详细信息面板中查看错误信息。

最终结果是这样的,可以将多个项目以不同的artifactId发布至同一个groupId中。

问题汇总

  1. pom.xml信息缺失,如url、name、description等都不能少
  2. No public key: 一般是因为你没有把本地GPG生成的RSA公钥发布至服务器中,可以参考此链接