发布到 maven 中央仓库-Publish-to-maven-central-repository

最近,Claude 发布了其最新版本 Claude 3,我计划将其集成到我的聊天网站 AI-Chat (AI-Chat)上。我访问了官方网站,发现只提供了 Python 和 TypeScript 的 SDK。遗憾的是,我在 GitHub 上并没有找到 Java 版本的 SDK。因此,我决定亲自动手编写一个,并且打算将其发布到 Maven 仓库中以便他人使用。
在寻找发布到 Maven 仓库的教程时,我发现互联网上的大多数指南都已过时。没有办法,我只能自己摸索整个流程。接下来,我将记录整个过程,希望能帮助到有相似需求但又遇到相同困难的其他开发者。

注意:已经不是在这个网站操作了:https://issues.sonatype.org,现在是在https://central.sonatype.com,网站上的很多教程依然是前者。

注册账号

Maven Central注册账号

生成token

点击右上角头像,选择“View Account”,之后 **Generate User Token
**,为自己生成一个token信息,记录下来。配置到本地maven的settings.xml:

<servers>
    <server>
      <id>central</id>
      <username>XXXXX</username>
      <password>CSDCEDEDEDEDE</password>    
    </server>
</servers>

配置Namespace

点击右上角头像选择 View Namespace,为自己添加一个Namespace(是你要发布的包的groupid中的域名)。我这边用的是自己的域名,所以直接添加,然后他需要你增加一个TXT的解析记录,添加好点击验证,等待他验证结束就可以了。

GPG配置

配置GPG密钥,这部分自行搜索处理 ,也可以参考:Working with PGP Signatures
生成之后查看下本地的密钥:

注意,以下部分的 CA925CD6C9E8D064FF05B4728190C4130ABA0F98 即为后面要用到的keyId

$ gpg --list-keys
/home/mylocaluser/.gnupg/pubring.kbx
---------------------------------
pub   rsa3072 2021-06-23 [SC] [expires: 2023-06-23]
      CA925CD6C9E8D064FF05B4728190C4130ABA0F98
uid           [ultimate] Central Repo Test <central@example.com>
sub   rsa3072 2021-06-23 [E] [expires: 2023-06-23]

记得要把 gpg key 上传:

注意 {keyid} 替换为你自己的

gpg  --keyserver hkps://keyserver.ubuntu.com --recv-keys {keyid}

POM配置

配置你要上传的项目的pom文件,添加:

注意修改对应的部分你的项目的实际值

<name>ai-java-sdk</name>
<description>a java sdk for ai apis.</description>
<url>https://github.com/vacuityv/ai-java-sdk</url>
<licenses>
    <license>
        <name>The Apache Software License, Version 2.0</name>
        <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
    </license>
</licenses>
<developers>
    <developer>
        <name>xxx</name>
        <email>xxx@icloud.com</email>
    </developer>
</developers>
<scm>
    <connection>scm:git:git://github.com/vacuityv/ai-java-sdk.git</connection>
    <developerConnection>scm:git:ssh://github.com:vacuityv/ai-java-sdk.git</developerConnection>
    <url>http://github.com/vacuityv/ai-java-sdk/tree/master</url>
</scm>
<distributionManagement>
    <repository>
        <id>central</id>
        <name>central-releases</name>
        <url>https://s01.oss.sonatype.org/</url>
    </repository>
</distributionManagement>

以及:

注意 {keyid} 替换为你自己的

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>3.3.0</version>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>3.6.3</version>
            <executions>
                <execution>
                    <id>attach-javadocs</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <doclint>none</doclint>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-gpg-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <id>sign-artifacts</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>sign</goal>
                    </goals>
                    <configuration>
                        <keyname>{keyid}</keyname>
                        <passphraseServerId>{keyid}</passphraseServerId>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <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>
    </plugins>
</build>

发布

至此所有前置操作都结束了,然后直接运行

mvn deploy

发布,再次过程会验证签名和上传文件。发布成功后在第一步注册的网站点击头像然后点击 “View Deployments” 就可以看到自己发布的文件了

总结

本来,将软件包发布到 Maven 中央仓库应该是一项相对规范和普遍的操作。互联网上也确实存在大量的指导教程,但随着时间的推移和流程的更新,我发现当前可见的大多数教程已经不再适用。这一现象导致我在尝试将自己编写的 Java SDK 发布到 Maven 时,花费了大量不必要的时间和精力。
为此,我决定撰写这篇文章,记录下我在发布过程中的探索和发现。通过这篇文章,我希望能够为那些在同样路径上或将面临类似挑战的开发者们,提供一份实用的参考,从而避免他们重复我的弯路,节省宝贵的时间。
如果你在使用过程中遇到了问题,也欢迎留言一起探讨。