Z次元

前言

网上之前关于上传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版本安装成功后,可直接在程序中进行可视化操作:

图片

评论区
发表评论
wu先生6月23日

不明觉历呀

-
前言
命名空间
创建命令空间
域名
代码托管服务
验证命名空间
域名
代码托管服务
验证
签名
安装 GnuPG
生成密钥对
列出密钥
签名文件
分发公钥
导入公钥
处理过期的密钥
Maven配置
可选通用配置
url
organization
developers
scm
license
通用插件
配置发布插件
凭证
发布组件
使用maven自动发布
手动发布
更多
后记