侧边栏壁纸
  • 累计撰写 14 篇文章
  • 累计创建 8 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

发布maven中央仓库

王富贵
2024-04-11 / 0 评论 / 0 点赞 / 110 阅读 / 0 字

1、发布maven中央仓库

请注意,该文章因为时过境迁已不适用于2024年发布。但大致内容差不多。你可以参考以下教程、官方文档和我的教程完成对应中央仓库发布。

Sonatype网站地址已经迁移至:Maven Central (sonatype.com)

以下文章以供参考:

Sonatype官方教程

如何发布jar包到maven中央仓库(2024年3月最新版保姆级教程)

以下为本人老教程

今天是2022年5月20日,我以切身经历,写了这篇将自己的开源包发布maven中央仓库的教程。

发布的包为:开箱即用的雪花漂移算法(yitter-idgenerator-spring-boot-starter)

参考文章:

hutool:将项目发布到 Maven 中央库

图文教你从零一步一步将Maven项目上传(发布)到中央仓库

将github项目上传到Maven中央仓库操作小记

步骤总结:

1.获取在 Sonatype 发布maven开源包资格。

整个流程在 Sonatype 的 JIRA 平台上完成,过程如下:

  1. 注册
  2. 提交一个 issue(提出一个发布申请),告诉工作人员我要创建一个构件。
  3. 等待工作人员审批,会给你发邮件,在这个 issue 下给你 comment 说明通过或者哪里有问题。
  4. 上传构件。
  5. 发布构建,并在哪个 issue 下告诉工作人员我发布了。
  6. 等待审核,如果通过会告诉你需要 release 一下并在 issue 上告诉工作人员我 release 了。
  7. 发布成功。

2.使用 Sonatype maven插件进行发布

3.通过平台审核自动发布,同时也会同步到maven中央仓库中去

1.1、具体步骤

我们使用 Sonatype 网站进行发布。

1.1.1、注册sonatype账号

注册地址是 https://issues.sonatype.org/secure/Signup!default.jspa

2

  • email:你的邮箱,非常重要,后续工作人员交互
  • full name:昵称
  • Username:用于登录的用户名
  • Password:密码

1.1.2、创建一个 Issue(问题)

创建一个issue(问题),表示我需要上传我的开源代码,那么后续过程管理员会通过此issue与你交互。

地址是 https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134

4

新建页面如下:

6

  • 项目:与我保持一致

  • 问题类型:选择 new project

  • 概要:可以写你项目名称

  • 描述:项目描述

  • Group Id:可以填写你的域名或者填写github个人地址

    1. 你的域名
      • 如果使用你的域名,后续需要你域名解析一个地址,来证明是你的域名
      • 如我购买并备案了一个域名lx6688.top,则我可以填写top.lx6688,注意需要反过来
    2. github个人地址
      • 当然,你可以使用github个人地址,后续需要你用此号建立一个github仓库,来证明是你拥有的github账号
      • 填写规则:io.github.你的github用户名。如我github账号名为lx6688,则我填写io.github.lx6688,请注意,不能使用com.github.lx6688
  • Project URL:可以填写你的开源地址

  • SCM url:可以填写你的开源地址,或你的开源首页

  • Username:填你github用户名即可

  • Already Synced to Central:表示你是否已经上传了到了maven中央仓库,这里我们选NO

后续点击创建即可创建工单

1.1.3、等待 Issue 审批

7

创建issue后,我们可以打开此issue,同时,你的issue有一个编号,如上图所示,我的编号为OSSRH-80968

等待片刻,会有管理员在你的issue下面进行评论,当然中文翻译成了注释,会告诉你相关的操作。如图所示:

8

如果你的Group Id设定正确的话(细节看我issue),管理员会如上图所示给你进行评论。大概的意思就是如果你是自己的域名,需要你使用该域名解析你issue的地址,解析类型为txt。如果你是使用github域名,请使用该账号创建一个名为issue编号的开源仓库。以上任意一种操作完成之后,你还需要将你的issue状态设置为 Open。

当然,如果你Group Id不符合这两种条件,管理员会发帖要你更正的。

1.1.3.1、使用自己的域名

比如我域名为:lx6688.top, issue地址为:https://issues.sonatype.org/browse/OSSRH-80968,我就可以在购买域名的服务商进行域名解析

9

如上图所示:

  • 记录类型:TXT
  • 主机记录:你自己选择你的记录
    • @的话可以直接访问根目录,我的就是访问`lx6688.top``
    • ``www的话就需要加前缀www,我的就是www.lx6688.top`
    • 也可以使用子域名这个你自己定,如果我是用此ossrh-80968子域名,则访问ossrh-80968.lx6688.top
    • 当然这属于域名解析的知识点了,你自己决定
  • 解析路线:默认就行
  • 记录值:你的issue地址,我的就是https://issues.sonatype.org/browse/OSSRH-80968

点击确定之后,我们就可以正常访问你的域名跳转到你的issue地址了。当然,你需要在下面回复管理员,你已经解析了该地址。

例如:

我使用ossrh-80968子域名,则访问ossrh-80968.lx6688.top

I have done DDNS. Please visit ossrh-80968.lx6688.top

最后,请记住你要将你的issue修改为open(开放状态),如下图所示

10

当然,管理员验证完成之后,你就可以删除解析

1.1.3.2、使用github主页

当然,如果你使用的是github主页作为你的Group Id,你只需要使用该账号创建一个开源的库即可(能够访问到),名字为issue编号

例如:我的github名字为lx6688,我的issue为OSSRH-80968,我就需要创建一个仓库名为OSSRH-80968的开源仓库

请不要忘记,将你的issue状态修改为open状态(开放)

10

当然,管理员验证完成之后,你就可以删除解析

1.1.3.3、校验成功

当看到 Configuration has been prepared, now you can: 这句话的时候,说明你已经通过了 Issue 的审批,可以上传构建了。

请注意下面粗体链接s01.oss.sonatype.org就是我们发布仓库地址

下图为校验成功截图

11

1.1.4、使用 GPG 生成密钥对

你会很莫名其妙的使用GPG生成密匙对。GPG是用来干嘛的?

主要是用于签名构建,为了防止你的构建不被第三方修改,因此使用了非对称协议来对传输内容进行加密。

官方文档说是签名构建用的,为了保证你的构件不被第三方篡改,用于验证,就是用这个东西在本地生成一个公钥和一个私钥,把公钥上传上去,当发布的时候用私钥签名一下(这个由 maven-gpg-plugin 搞定,不用我们自己来)。

当然我们可以使用GPG生成软件帮助我们生成。软件地址:gpg4win

安装成功之后,我们可以通过软件生成,也可以通过cmd命令行生成。

命令行通用命令如下:

# 查看版本来检查
gpg --version
# 生成密钥对
gpg --gen-key
# 查看生成的公钥
gpg --list-keys
# 将公钥发布到GPG密钥服务器
gpg --keyserver 公匙存储服务器链接 --send-keys 公钥值
# 查询是否已将公钥发布到服务器
gpg --keyserver 公匙存储服务器链接 --recv-keys 公钥值

步骤如下:

  1. 下载GPG生成软件,来生成非对称加密的公钥和私钥
  2. 将公钥上传到公共公钥仓库中,加密方会去获取你的公钥使用你的公钥进行加密

1.1.4.1、软件生成

当然,软件也需要结合命令行,我们还是推荐使用软件的形式。

我们点击文件->新建密匙对,如图所示,输入你的名字和电子邮箱,点击新建即可

12

新建完成之后,我们可以在主界面看见我们生成的公匙,双击点开,可以看看详细的内容。

13

生成之后,我们需要将公匙上传至服务器校验,但请注意,sonatype官方读取的公匙服务器地址为以下几个:

这里贴出:sonatype官网gpg密钥文档

- keyserver.ubuntu.com
- keys.openpgp.org
- pgp.mit.edu
# 我们可以使用以下命令进行上传
gpg --keyserver 公匙存储服务器链接 --send-keys 公钥值

# 我们可以使用一下命令校验是否上传成功 
gpg --keyserver 公匙存储服务器链接 --recv-keys 公钥值

例如我的公匙值为,123456789,那我三个服务器都发一下

gpg --keyserver keyserver.ubuntu.com --send-keys 123456789
gpg --keyserver keys.openpgp.org --send-keys 123456789
gpg --keyserver pgp.mit.edu --send-keys 123456789

实测前两个还行,后面一个不是很行,发不上去

1.1.4.2、命令行生成

当然命令行的方式就是用了其他三个命令

# 查看版本来检查
gpg --version
# 生成密钥对
gpg --gen-key
# 查看生成的公钥
gpg --list-keys

使用gpg --gen-key即可生成密匙对,期间会要求你输入密码也就是密匙

使用gpg --list-keys即可查看公匙,记住公匙即可

其他步骤与上无异

生成之后,我们需要将公匙上传至服务器校验,但请注意,sonatype官方读取的公匙服务器地址为以下几个:

这里贴出:sonatype官网gpg密钥文档

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

1.1.4.3、发送到公共公钥仓库中

# 我们可以使用以下命令进行上传
gpg --keyserver 公匙存储服务器链接 --send-keys 公钥值

# 我们可以使用一下命令校验是否上传成功 
gpg --keyserver 公匙存储服务器链接 --recv-keys 公钥值

例如我的公匙值为,123456789,那我三个服务器都发一下

gpg --keyserver keyserver.ubuntu.com --send-keys 123456789
gpg --keyserver keys.openpgp.org --send-keys 123456789
gpg --keyserver pgp.mit.edu --send-keys 123456789

实测前两个还行,后面一个不是很行,发不上去

1.1.5、修改配置文件

当然,为了成功发布,我们需要修改一些maven的配置文件

发布配置文件官方文档

GPG说明官方文档

1.1.5.1、修改 setting.xml 文件

我们需要修改maven的setting.xml文件

setting.xml 这个文件存在于两个地方,一个是用户的 Maven 配置文件,在 ${user}/.m2/setting.xml${user} 表示你的用户目录,这个文件只对当前用户有效,另一个在你 Maven 安装目录的 conf/setting.xml 文件,这个是全局的配置文件,考虑到我的电脑只有自己用,所以只用全局配置文件添加内容如下:

<servers>
    <server>
        <id>ossrh</id>
        <username>sonatype注册的用户名</username>
        <password>sonatype该用户名的密码</password>
    </server>
</servers>

当然,在setting.xml文件中,<servers></servers>键值对是存在的,请你也灵巧变通一下。在里面配置你前面平台所注册的账号和密码。

1.1.5.2、修改 pom.xml 文件

我们要在需要发布的项目的pom文件中配置一些内容,以便于我们的发布。

pom.xml 在 Maven 中央库的审核比较严格,必须有固定的一些字段,还有发布的构件必须包含字节码 jar、源码 jar、文档 jar,这些都可以通过 maven 插件搞定,具体这个文件我就不贴了,当然你可以参考我的pom文件

其中必须字段是:

  • name
  • description
  • url
  • licenses
  • developers
  • scm

基本信息可以可以根据实际情况修改,snapshotRepository地址需要填写之前管理员回复给你的,详情见1.1.3.3的图。当然,大多人都是一样的,只有在大版本更新才不一样。

版本号我们需要提一下:分为

  1. release:发布版本,测试成功十分稳定的版本,后缀使用-RELEASE,如下所示,我们就可以更改为<version>1.0.7-RELEASE</version>
  2. snapshot:快照版本,不一定稳定,会经常更改的版本,后缀使用-SNAPSHOT,如下所示,我们就可以更改为<version>1.0.7-SNAPSHOT</version>

当然,我们可以什么后缀都不加,那就是默认release版本,但是,通过后缀的不同,会发布到不同的仓库里面去的,官方仓库就有发布和快照仓库,会将版本隔离

<!--组id,引入的时候与我们之前配置的groupId一致-->
<groupId>io.github.lx6688</groupId>
<!--工件id,引入时候与其一致-->
<artifactId>yitter-idgenerator-spring-boot-starter</artifactId>
<!--版本号-->
<version>1.0.7</version>
<!--项目描述-->
<description>yitter雪花漂移算法自动配置启动模块</description>
<!--打包方式-->
<packaging>jar</packaging>
<!--x,不能中文-->
<name>yitter-idgenerator--spring-boot-starter</name>
<!--作者主页-->
<url>www.lx6688.top</url>

<!--开源证书,你的github项目的开源证书地址-->
<licenses>
    <license>
        <name>MIT</name>
        <url>https://github.com/lx6688/yitter-idgenerator-spring-boot-starter/blob/master/LICENSE</url>
    </license>
</licenses>

<!-- 项目信息 -->
<scm>
    <url>https://github.com/lx6688/yitter-idgenerator-spring-boot-starter</url>
    <connection>scm:git:https://git@github.com/lx6688/yitter-idgenerator-spring-boot-starter.git</connection>
    <developerConnection>https://github.com/lx6688</developerConnection>
</scm>

<!-- 作者信息 -->
<developers>
    <developer>
        <name>li xiang</name>
        <email>1938857445@qq.com</email>
        <timezone>+8</timezone>
        <roles>
            <role>Developer</role>
        </roles>
    </developer>
</developers>

<!--snapshotRepository地址,我们需要上传的地址,申请成功后会发帖告诉你地址的-->
<distributionManagement>
    <snapshotRepository>
        <id>ossrh</id>
        <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
    </snapshotRepository>
    <repository>
        <id>ossrh</id>
        <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
</distributionManagement>

构建插件

<!--构建-->
<build>
    <plugins>
        
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>${compile.version}</source>
                <target>${compile.version}</target>
                <compilerArgument>-Xlint:unchecked</compilerArgument>
            </configuration>
        </plugin>
        
        <!-- Javadoc -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
            <version>2.9</version>
            <executions>
                <execution>
                    <id>attach-javadocs</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <!--自定义的注释注解忽略报错-->
                    <configuration>
                        <additionalparam>-Xdoclint:none</additionalparam>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- 打包源码插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.2.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

构建行为配置

可以使用id标识是release发布版本还是snapshot版本,也可以用其他名字,但请注意下面的1.1.6发布到oss中,就需要我们指定profile的id,也就是指定的发布行为了,通常我们会使用它隔离发布行为。

<profiles>
    <profile>
        <id>sonatype</id>
        <distributionManagement>
            <snapshotRepository>
                <id>ossrh</id>
                <url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
            </snapshotRepository>
            <repository>
                <id>ossrh</id>
                <url>https://s01.oss.sonatype.orgservice/local/staging/deploy/maven2/</url>
            </repository>
        </distributionManagement>
        <build>
            <plugins>
                <!-- 打包源 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-source-plugin</artifactId>
                    <version>3.2.1</version>
                    <executions>
                        <execution>
                            <id>oss</id>
                            <phase>package</phase>
                            <goals>
                                <goal>jar-no-fork</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <!-- Gpg 签证 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-gpg-plugin</artifactId>
                    <version>1.5</version>
                    <executions>
                        <execution>
                            <id>ossrh</id>
                            <phase>verify</phase>
                            <goals>
                                <goal>sign</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <!--发布源地址-->
                <plugin>
                    <groupId>org.sonatype.plugins</groupId>
                    <artifactId>nexus-staging-maven-plugin</artifactId>
                    <version>1.6.7</version>
                    <extensions>true</extensions>
                    <configuration>
                        <serverId>ossrh</serverId>
                        <nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
                        <autoReleaseAfterClose>true</autoReleaseAfterClose>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

指定构建行为,也就是profile下的id的内容。我们指定什么,就是按照指定的构建行为进行构建项目和推送

<!--推送使用rdc,也就是上面阿里构建配置的id,如果要推送其他的,需要注释-->
<!--他也相当于推送的时候-P xxx表示使用哪个构建配置-->
<activeProfiles>
    <!--<activeProfile>sonatype</activeProfile>    -->
    <activeProfile>alibaba</activeProfile>
</activeProfiles>

1.1.5.3、注意

  1. 这里我按照原博客的方法,把发布限制在了一个 profile 里(Profile 理解为一个构建行为的配置,每种行为对应一个 profile,例如线上、测试的某些配置不同,就可以分为不同的 profile 执行,如果你还不明白就自行百度吧~)
  2. 发布需要的 source 插件、javadoc 插件、gpg 插件都在这个 profile 里,这样只有在发布的时候才会生成源码包、文档 API 包和做 gpg 签名。
  3. distributionManagement 则是定义了 releasesnapshot 发布的地址,这个在 Issue 通过审核后工作人员会给你
  4. snapshotRepositoryrepository 中的 id 一定要与 setting.xmlserverid 保持一致。
  5. 如果是插件找不到,我们可以先将他放到dependencies里面下载,在删除

1.1.6、发布到oss

接下来,我们就可以通过maven工具将我们的包发布到远程仓库里面去了。

我们可以使用idea的控制台,或者powershell,在项目根目录下执行发布命令了。命令如下:

mvn clean deploy -P sonatype -Dgpg.passphrase=GPG密钥

这一步特别说明下,执行 mvn clean deploy -P release 会自动弹出一个对话框,我这里没有弹出来…… 而且报签名异常,后来百度之,得加上 -Dgpg.passphrase=你的Passphase 这个参数,用你自己的 Passphase,就可以成功了(我严重怀疑 Cygwin 的问题……)还有 - P 参数表示使用的 profile 名,就是pom.xml文件或者profile 下 <id>sonatype</id > 这个标签的内容。

还有就是,如果你不是使用cmd,而是其他控制台,如idea的控制台,powershell等等,他可能会识别不了-Dgpg.passphrase=GPG密钥这个指令,我们需要使用单引号将字符串引起来。示例如下:

mvn clean deploy -P sonatype '-Dgpg.passphrase=GPG密钥'

当然,我们强烈建议连个命令都执行一下

程序如果没有报error,则会发布到仓库中,如果报了error,请自行用报错原因百度。

1.1.7、发布构建

发布到oss之后,你以为这完了么?我们还需要发布构建,才能真正发布到maven中央仓库里面去。

进入 https://s01.oss.sonatype.org/#stagingRepositories 并登陆,账号就是我们开始注册的账号,会在左侧有个 staging Repositories 点击进入,在右侧面板找到你的构件,状态应该是 open,你要将其置为 close,点击上方的 close 按钮即可

什么意思呢,就是我们发布的包会暂存在此,我们需要选择他点击检查(点击close),检查没问题再点击Release即可发布。当然,也有可能他自动Release发布了。

1.找到我们暂存的包

14

2.点击close,检查包,等待一下下,如果成功会给你发送右键表示说检查成功,如果失败则如下图所示。

16

请修改你的其他信息后再次上传,再次点击close按钮。如果没问题点击Release即可发布。

1.1.7.1、错误

在这个步骤可能会出现各种各样的错误,耐心分析原因即可。

我也贴出别人的文章,可以看看人家遇见的错误。

发布maven中央仓库

这里描述的错误有

  • pom没有配置 name、description、url 、license
  • 没有sources jar
  • 没有签名文件
  • 远程sign验证异常
1.1.7.1.1、签名验证错误

当然,没有签名文件也可能是我们根本没有验证,正如我在1.1.6、发布到oss中所说的,我配置类GPG校验但他没有弹出框来要我输入密钥,肯定就签名验证错误咯。解决方案我在1.1.6也描述了,自行跳转去看

1.1.7.1.2、迟迟没同步maven官方仓库

当我们点击发布成功之后,在控制台搜索栏中是能够搜索到我们的包的,但是迟迟不发布到maven官方仓库当中去。我是十二个小时都没有发布上去。

先说结果,发布的每个包都需要sonatype的人工审核,由于是开源网站,因此可能轮询到单天的管理员懈怠了,导致迟迟不发布。并且sonatype是美国网站,与中国时区相差12个小时,请你务必注意发布时间是否与当地休息时间冲突。(不可能大半夜要人家审核吧)

当然,这也是我发帖询问到的。如果你有其他问题,也可以在sonatype上面发帖寻求帮助。发帖链接如下: https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=11003&pid=10134

当然,我也贴出我发布的问题,以供大家参考:https://issues.sonatype.org/browse/MVNCENTRAL-7432

1.1.7.2、校验发布

当然,我们都搞定之后,怎么知道我发布成功了没?

如果你发布成功,sonatype官方会发一封邮件给你。

Central sync is activated for io.github.lx6688. After you successfully release, your component will be available to the public on Central https://repo1.maven.org/maven2/ , typically within 30 minutes, though updates to https://search.maven.org can take up to four hours.

大概的意思是大约三十分钟就可以同步到maven官方网站,地址为:https://repo1.maven.org/maven2 ,比如我的Group Id为:io.github.lx6688则我需要访问:https://repo1.maven.org/maven2/io/github/lx6688/

大约四个小时就可以在https://search.maven.org 搜索到你的包。事实上,我等了将近24小时才能搜索到

我们也可以手动搜索

如图所示,可以使用我们的Group Id搜索包,查看是否成功。

17

1.1.7.2.1、阿里镜像同步问题

阿里maven镜像源不会主动同步maven官方仓库,只有在有人导入了此依赖并发现没有此包的时候,会主动的去maven官方仓库搜索一下此包,如果存在会主动同步过来。因此,你的包在maven官方仓库同步完成之后,建议单独使用阿里maven镜像源依赖同步一下此包。

0

评论区