文章详细讲解了如何通过sonatype平台将Maven项目组件上传到Maven中心仓的最新流程。步骤包括创建命名空间、验证命名空间、安装GnuPG进行文件签名、Maven配置、凭证设置及组件发布。文中还提供了详细的Maven插件配置示例。此外,还介绍了自动发布和手动发布组件的方法。
前言
网上之前关于上传Maven项目(Jar包)到Maven中心仓的教程大部分都已失效,因为 OSSRH
和 issues.sonatype.org
已经弃用,并在2024年3月换成了新的发布方式。
官方说明中是这样写的:
首先我们在sonatype完成账号注册后,会自动跳转到官方文档,可以按照官方文档进行后续操作。
当然也可以根据本文指引完成,因为本文即是根据最新的文档完成的。
完整的过程主要有下面几个步骤:
- 声明发布命名空间
- 使用 Web 界面将组件发布到 Maven Central
- 使用 Maven 构建插件将组件发布到 Maven Central
- 设置一个 webhook,用于在组件成功发布后进行通知
- 管理凭据
命名空间
创建命令空间
账号登录完成后,点击自己的账号(右上角)->View Namespaces。
然后我们添加一个新的命名空间。
需要注意的是,命名空间支持域名以及具有代码托管服务的网址两种方式。
域名
如果你拥有自己的域名,那么groupId的命名方式即为域名的反转。
例如,如果您控制 ahzoo.cn
,则可以使用以 cn.ahzoo
开头的任何 groupId ,例如 cn.ahzoo.domain
、cn.ahzoo.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官网下载并安装。
执行命令验证是否成功安装:
$ gpg --version
生成密钥对
$ gpg --gen-key
按照提示输入相关信息,然后设置密码,需要输入两次。
生成密钥过程中必须提供名称和电子邮件。这些标识符至关重要,因为下载软件工件和验证签名的任何人都会看到它们。然后你可以使用密码来保护你的密钥。此密码和私钥是使用签名签署工件所需的全部内容。
密钥的有效期默认为 3 年(文档说是2年,可能是GnuPG更新了默认的过期策略)。密钥过期后,可以延长密钥的有效期,前提是你拥有密钥并知道密码。
列出密钥
$ gpg --list-keys
输出显示公钥环文件的路径。以 pub开头的行显示公钥的大小、密钥 ID和创建日期。某些值可能会因你的 GnuPG 版本而异,但你肯定会看到密钥 ID 或其一部分(称为短 ID,即密钥 ID 的最后 8 个字符,这时可以使用这条命令输出gpg:gpg --list-keys --keyid-format short
)。
下一行显示密钥的 UID,它由名称、注释和电子邮件组成。
签名文件
$ gpg -ab ahzoo.java
-a:创建 ASCII 保护输出,
-b:创建分离签名。
如果你的私钥有密码,系统会要求你输入密码。如果没有密码,那么伪造工件签名所需的就是你的私钥。密码是推荐的额外保护级别。
其他人可以通过以下命令来使用公钥验证文件:
$ gpg --verify ahzoo.java.asc
分发公钥
由于其他人需要公钥来验证你的文件,因此你必须将你的公钥分发给密钥服务器:
$ gpg --keyserver keyserver.ubuntu.com --send-keys [密钥 ID]
由于 SKS 密钥服务器网络已被弃用,建议使用特定的 GPG 密钥服务器。当前支持的 GPG 密钥服务器包括:
keyserver.ubuntu.com
keys.openpgp.org
pgp.mit.edu
导入公钥
将公钥从密钥服务器导入到本地机器中:
$ gpg --keyserver keyserver.ubuntu.com --recv-keys [密钥 ID]
处理过期的密钥
此部分内容将在博主密钥快过期时再进行补充😁。感兴趣的可自行先在sonatype官网查看。
Maven配置
sonatype支持多种发布方式,本文只演示使用maven进行发布。
可选通用配置
url
地址
<url>https://ahzoo.cn</url>
organization
组织信息
<organization>
<name>Ahzoo</name>
<url>https://ahzoo.cn</url>
</organization>
developers
开发者信息
<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
版本控制地址
<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
<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>
通用插件
<!-- 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包时需要下面的配置
<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
插件。
示例:
<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
生成凭证,记录下此凭证。
示例:
<settings>
<servers>
<server>
<id>central</id>
<username><!-- your token username --></username>
<password><!-- your token password --></password>
</server>
</servers>
</settings>
发布组件
需要注意的是:组件一旦发布/公布,将无法删除/更新/修改。只能通过版本进行升级。
使用maven自动发布
在之前的pom文件配置中,我们设置了
autoPublish
为true
,将在文件验证通过后自动发布组件。如果你不希望自动发布组件,可以将该配置删除,然后在sonatype中手动发布。
可以通过 mvn deploy
命令生成包,并上传到sonatype中。
执行下面命令:
$ mvn clean install deploy -P release
上传完成后,等待验证通过后,可以在sonatype上看到发布成功。
然后只需静待同步到Maven中心仓即可。
同步完成后可以在sonatype主页中搜索到相关的依赖,
然后就可以像引用其它依赖那样引用我们的组件了。
手动发布
除了通过Maven发外,还可以手动将组件上传到sonatype中,然后执行发布操作。
通过Maven的install命令安装组件后,打包对应的组件,然后上传即可,这是一个组件文件的示例:
$ 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版本安装成功后,可直接在程序中进行可视化操作:
1
不明觉历呀