前言

网上之前关于上传Maven项目(Jar包)到Maven中心仓的教程大部分都已失效,因为OSSRHissues.sonatype.org已经弃用,并在2024年3月换成了新的发布方式。

图片

首先我们在sonatype完成账号注册后,会自动跳转到官方文档,可以按照官方文档进行后续操作。

当然也可以根据本文指引完成,因为本文即是根据最新的文档完成的。

完整的过程主要有下面几个步骤:

  • 声明发布命名空间
  • 使用 Web 界面将组件发布到 Maven Central
  • 使用 Maven 构建插件将组件发布到 Maven Central
  • 设置一个 webhook,用于在组件成功发布后进行通知
  • 管理凭据

命名空间

创建命令空间

账号登录完成后,点击自己的账号(右上角)->View Namespaces。

图片

然后我们添加一个新的命名空间。

需要注意的是,命名空间支持域名以及具有代码托管服务的网址两种方式。

域名

如果你拥有自己的域名,那么groupId的命名方式即为域名的反转。

例如,如果您控制ahzoo.cn,则可以使用以com.example开头的任何 groupId ,例如com.example.domaincom.example.testsupport等。

其他示例包括:

  • test.ahzoo.cn -> cn.ahzoo
  • ahzoo.cn -> cn.ahzoo

groupId应该完全反转域名,即使域名包含连字符或其他会导致无效Java包名称的字符。同时连字符在groupId中是完全支持的,所以无需额外更改Java包名来匹配它。

代码托管服务

如果你使用的是代码托管服务,groupId的示例如下:

服务 示例命名空间
GitHub io.github.username
Gitee io.gitee.username

验证命名空间

命名空间创建完成后会生成一个密钥,复制这个密钥。

然后根据命名空间的创建方式,我们选择不同的验证方式:域名或者代码托管服务。

域名

如果你是通过域名创建的命名空间,需要使用此方式验证。

新建一个DNS TXT记录,记录值为刚才复制的密钥。

代码托管服务

如果你是通过代码托管服务创建的命名空间,需要使用此方式验证。

在代码仓库中,新建一个公共存储仓库:例如github.com/ahzoo/verification-key

验证

上面的工作准备好后,点击验证即可,验证通过如下:

图片

签名

将组件发布到中心仓之前,必须要对文件使用 PGP 签名。可以使用GnuPG或GPG进行签名操作。发布时必须携带.md5.sha1加密后的文件。

安装 GnuPG

GnuPG官网下载并安装。

执行命令验证是否成功安装:

1
$ gpg --version

生成密钥对

1
$ gpg --gen-key

按照提示输入相关信息,然后设置密码,需要输入两次。

图片

生成密钥过程中必须提供名称和电子邮件。这些标识符至关重要,因为下载软件工件和验证签名的任何人都会看到它们。然后你可以使用密码来保护你的密钥。此密码和私钥是使用签名签署工件所需的全部内容。

密钥的有效期默认为 3 年(文档说是2年,可能是GnuPG更新了默认的过期策略)。密钥过期后,可以延长密钥的有效期,前提是你拥有密钥并知道密码。

列出密钥

1
$ gpg --list-keys

输出显示公钥环文件的路径。以 pub开头的行显示公钥的大小、密钥 ID和创建日期。某些值可能会因你的 GnuPG 版本而异,但你肯定会看到密钥 ID 或其一部分(称为短 ID,即密钥 ID 的最后 8 个字符,这时可以使用这条命令输出gpg:gpg --list-keys --keyid-format short)。

下一行显示密钥的 UID,它由名称、注释和电子邮件组成。

签名文件

1
$ gpg -ab ahzoo.java

-a:创建 ASCII 保护输出,

-b:创建分离签名。

如果你的私钥有密码,系统会要求你输入密码。如果没有密码,那么伪造工件签名所需的就是你的私钥。密码是推荐的额外保护级别。

其他人可以通过以下命令来使用公钥验证文件:

1
$ gpg --verify ahzoo.java.asc 

分发公钥

由于其他人需要公钥来验证你的文件,因此你必须将你的公钥分发给密钥服务器:

1
$ gpg --keyserver keyserver.ubuntu.com --send-keys [密钥 ID]

由于 SKS 密钥服务器网络已被弃用,建议使用特定的 GPG 密钥服务器。当前支持的 GPG 密钥服务器包括:

  • keyserver.ubuntu.com
  • keys.openpgp.org
  • pgp.mit.edu

导入公钥

将公钥从密钥服务器导入到本地机器中:

1
$ gpg --keyserver keyserver.ubuntu.com --recv-keys [密钥 ID]

处理过期的密钥

此部分内容将在博主密钥快过期时再进行补充😁。感兴趣的可自行先在sonatype官网查看。

Maven配置

sonatype支持多种发布方式,本文只演示使用maven进行发布。

可选通用配置

url

地址

1
<url>https://ahzoo.cn</url>

organization

组织信息

1
2
3
4
<organization>
<name>Ahzoo</name>
<url>https://ahzoo.cn</url>
</organization>

developers

开发者信息

1
2
3
4
5
6
7
8
9
10
11
12
<developers>
<developer>
<id>ahzoo</id>
<name>ahzoo</name>
<email>xxx@qq.com</email>
<organization>Ahzoo</organization>
<organizationUrl>https://ahzoo.cn</organizationUrl>
<roles>
<role>Project lead</role>
</roles>
</developer>
</developers>

scm

版本控制地址

1
2
3
4
5
<scm>
<connection>scm:git:git://github.com/ooahz/xxx.git</connection>
<developerConnection>scm:git:ssh://git@github.com/ooahz/xxx.git</developerConnection>
<url>https://github.com/ooahz</url>
</scm>

license

1
2
3
4
5
6
7
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>

通用插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!--            maven打包相关依赖-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<fork>true</fork>
<verbose>true</verbose>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>3.0.1</version>
</plugin>

上传jar包时需要下面的配置

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
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.1.0</version>
<inherited>true</inherited>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<excludeResources>true</excludeResources>
<useDefaultExcludes>true</useDefaultExcludes>
</configuration>
</plugin>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.7.0</version>
<inherited>true</inherited>
<executions>
<execution>
<id>bundle-sources</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<maxmemory>1024</maxmemory>
<encoding>UTF-8</encoding>
<show>protected</show>
<notree>true</notree>
<failOnError>false</failOnError>
<doclint>none</doclint>
</configuration>
</plugin>

配置发布插件

配置central-publishing-maven-plugin插件。

示例:

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
<build>
<plugins>
<!-- sonatype发布-->
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.4.0</version>
<extensions>true</extensions>
<configuration>
<publishingServerId>central</publishingServerId>
<tokenAuth>true</tokenAuth>
<!-- 自动发布-->
<autoPublish>true</autoPublish>
</configuration>
</plugin>

<!-- gpg签名-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

凭证

发布时需要在maven的settings.xml进行凭据配置。

进入sonatype的帐户页面,在账号界面,点击Generate User Token生成凭证,记录下此凭证。

示例:

1
2
3
4
5
6
7
8
9
<settings>
<servers>
<server>
<id>central</id>
<username><!-- your token username --></username>
<password><!-- your token password --></password>
</server>
</servers>
</settings>

发布组件

需要注意的是:组件一旦发布/公布,将无法删除/更新/修改。只能通过版本进行升级。

使用maven自动发布

在之前的pom文件配置中,我们设置了autoPublishtrue,将在文件验证通过后自动发布组件。如果你不希望自动发布组件,可以将该配置删除,然后在sonatype中手动发布。

可以通过mvn deploy命令生成包,并上传到sonatype中。

执行下面命令:

1
$ mvn clean install deploy -P release

上传完成后,等待验证通过后,可以在sonatype上看到发布成功。

图片

然后只需静待同步到Maven中心仓即可。

同步完成后可以在sonatype主页中搜索到相关的依赖,

图片

然后就可以像引用其它依赖那样引用我们的组件了。

手动发布

除了通过Maven发外,还可以手动将组件上传到sonatype中,然后执行发布操作。

通过Maven的install命令安装组件后,打包对应的组件,然后上传即可,这是一个组件文件的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ tree
.
`-- com
`-- sonatype
`-- central
`-- example
`-- cn_ahzoo_project
`-- 0.1.0
|-- cn_ahzoo_project-0.1.0-javadoc.jar
|-- cn_ahzoo_project-0.1.0-javadoc.jar.asc
|-- cn_ahzoo_project-0.1.0-javadoc.jar.md5
|-- cn_ahzoo_project-0.1.0-javadoc.jar.sha1
|-- cn_ahzoo_project-0.1.0-sources.jar
|-- cn_ahzoo_project-0.1.0-sources.jar.asc
|-- cn_ahzoo_project-0.1.0-sources.jar.md5
|-- cn_ahzoo_project-0.1.0-sources.jar.sha1
|-- cn_ahzoo_project-0.1.0.jar
|-- cn_ahzoo_project-0.1.0.jar.asc
|-- cn_ahzoo_project-0.1.0.jar.md5
|-- cn_ahzoo_project-0.1.0.jar.sha1
|-- cn_ahzoo_project-0.1.0.pom
|-- cn_ahzoo_project-0.1.0.pom.asc
|-- cn_ahzoo_project-0.1.0.pom.md5
`-- cn_ahzoo_project-0.1.0.pom.sha1

输入部署名称,自定义,推荐命名方式为:your.groupId:your.artifactId:0.0.your-version

图片

更多

本文教程只写到将组件发布到中心仓,更多拓展功能可到官网查阅。

后记

gnupg的windows版本安装成功后,可直接在程序中进行可视化操作:

图片