前言

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

官方说明中是这样写的:

图片

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

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

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

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

命名空间

创建命令空间

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

图片

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

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

域名

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

例如,如果您控制ahzoo.cn,则可以使用以cn.ahzoo开头的任何 groupId ,例如cn.ahzoo.domaincn.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文件配置中,我们设置了autoPublishtrue,将在文件验证通过后自动发布组件。如果你不希望自动发布组件,可以将该配置删除,然后在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版本安装成功后,可直接在程序中进行可视化操作:

图片

知识积累
将Maven项目组件上传到Maven中心仓(借助sonatype)
2024/7/21
String.valueOf()踩坑记录
2024/7/21
使用Mapstruct轻松实现实体类转换
2024/7/21
发表评论
wu先生6月23日

不明觉历呀

湖北省