1、发布maven中央仓库
请注意,该文章因为时过境迁已不适用于2024年发布。但大致内容差不多。你可以参考以下教程、官方文档和我的教程完成对应中央仓库发布。
Sonatype网站地址已经迁移至:Maven Central (sonatype.com)
以下文章以供参考:
如何发布jar包到maven中央仓库(2024年3月最新版保姆级教程)
以下为本人老教程
今天是2022年5月20日,我以切身经历,写了这篇将自己的开源包发布maven中央仓库的教程。
发布的包为:开箱即用的雪花漂移算法(yitter-idgenerator-spring-boot-starter)
参考文章:
步骤总结:
1.获取在 Sonatype 发布maven开源包资格。
整个流程在 Sonatype 的 JIRA 平台上完成,过程如下:
- 注册
- 提交一个 issue(提出一个发布申请),告诉工作人员我要创建一个构件。
- 等待工作人员审批,会给你发邮件,在这个 issue 下给你 comment 说明通过或者哪里有问题。
- 上传构件。
- 发布构建,并在哪个 issue 下告诉工作人员我发布了。
- 等待审核,如果通过会告诉你需要 release 一下并在 issue 上告诉工作人员我 release 了。
- 发布成功。
2.使用 Sonatype maven插件进行发布
3.通过平台审核自动发布,同时也会同步到maven中央仓库中去
1.1、具体步骤
我们使用 Sonatype 网站进行发布。
1.1.1、注册sonatype账号
注册地址是 https://issues.sonatype.org/secure/Signup!default.jspa
- email:你的邮箱,非常重要,后续工作人员交互
- full name:昵称
- Username:用于登录的用户名
- Password:密码
1.1.2、创建一个 Issue(问题)
创建一个issue(问题),表示我需要上传我的开源代码,那么后续过程管理员会通过此issue与你交互。
地址是 https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134
新建页面如下:
-
项目:与我保持一致
-
问题类型:选择 new project
-
概要:可以写你项目名称
-
描述:项目描述
-
Group Id:可以填写你的域名或者填写github个人地址
- 你的域名
- 如果使用你的域名,后续需要你域名解析一个地址,来证明是你的域名
- 如我购买并备案了一个域名
lx6688.top
,则我可以填写top.lx6688
,注意需要反过来
- 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 审批
创建issue后,我们可以打开此issue,同时,你的issue有一个编号,如上图所示,我的编号为OSSRH-80968
等待片刻,会有管理员在你的issue下面进行评论,当然中文翻译成了注释,会告诉你相关的操作。如图所示:
如果你的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,我就可以在购买域名的服务商进行域名解析
如上图所示:
- 记录类型: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(开放状态),如下图所示
当然,管理员验证完成之后,你就可以删除解析
1.1.3.2、使用github主页
当然,如果你使用的是github主页作为你的Group Id,你只需要使用该账号创建一个开源的库即可(能够访问到),名字为issue编号
例如:我的github名字为lx6688
,我的issue为OSSRH-80968
,我就需要创建一个仓库名为OSSRH-80968
的开源仓库
请不要忘记,将你的issue状态修改为open状态(开放)
当然,管理员验证完成之后,你就可以删除解析
1.1.3.3、校验成功
当看到 Configuration has been prepared, now you can:
这句话的时候,说明你已经通过了 Issue 的审批,可以上传构建了。
请注意下面粗体链接s01.oss.sonatype.org
就是我们发布仓库地址
下图为校验成功截图
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 公钥值
步骤如下:
- 下载GPG生成软件,来生成非对称加密的公钥和私钥
- 将公钥上传到公共公钥仓库中,加密方会去获取你的公钥使用你的公钥进行加密
1.1.4.1、软件生成
当然,软件也需要结合命令行,我们还是推荐使用软件的形式。
我们点击文件->新建密匙对
,如图所示,输入你的名字和电子邮箱,点击新建即可
新建完成之后,我们可以在主界面看见我们生成的公匙,双击点开,可以看看详细的内容。
生成之后,我们需要将公匙上传至服务器校验,但请注意,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的配置文件
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的图。当然,大多人都是一样的,只有在大版本更新才不一样。
版本号我们需要提一下:分为
- release:发布版本,测试成功十分稳定的版本,后缀使用
-RELEASE
,如下所示,我们就可以更改为<version>1.0.7-RELEASE</version>
- 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、注意
- 这里我按照原博客的方法,把发布限制在了一个 profile 里(Profile 理解为一个构建行为的配置,每种行为对应一个 profile,例如线上、测试的某些配置不同,就可以分为不同的 profile 执行,如果你还不明白就自行百度吧~)
- 发布需要的 source 插件、javadoc 插件、gpg 插件都在这个 profile 里,这样只有在发布的时候才会生成源码包、文档 API 包和做 gpg 签名。
distributionManagement
则是定义了release
和snapshot
发布的地址,这个在 Issue 通过审核后工作人员会给你snapshotRepository
与repository
中的id
一定要与setting.xml
中server
的id
保持一致。- 如果是插件找不到,我们可以先将他放到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.找到我们暂存的包
2.点击close,检查包,等待一下下,如果成功会给你发送右键表示说检查成功,如果失败则如下图所示。
请修改你的其他信息后再次上传,再次点击close按钮。如果没问题点击Release即可发布。
1.1.7.1、错误
在这个步骤可能会出现各种各样的错误,耐心分析原因即可。
我也贴出别人的文章,可以看看人家遇见的错误。
这里描述的错误有
- 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搜索包,查看是否成功。
1.1.7.2.1、阿里镜像同步问题
阿里maven镜像源不会主动同步maven官方仓库,只有在有人导入了此依赖并发现没有此包的时候,会主动的去maven官方仓库搜索一下此包,如果存在会主动同步过来。因此,你的包在maven官方仓库同步完成之后,建议单独使用阿里maven镜像源依赖同步一下此包。
评论区