哈喽大家好啊,我是Hydra。,前几天我在网上冲浪的时候,看见有一个老铁在git上给我提了一个issue:,
,万万没想到,有一天我写的烂代码居然也会被要求提到中央仓库…,话再说回来,发布jar包到中央仓库这个事,也不是我不想,而是真的不会啊!,不过既然铁子们都开口了,我这硬着头皮也得上不是?那么从网上翻翻文档,正式开搞。,首先第一步,我们需要在sonatype上注册账号并提交一个issue。,sonatype这个名字,突然一说大家可能有点反应不过来,但是看完下面这张图大家应该就明白了:,
,没错,如果各位所在的公司有搭建自己的maven私服的话,那么一般用的就是sonatype公司开发的Nexus了。,这时候有小伙伴们估计就要问了,那么我要上传中央仓库和你sonatype又有什么关系?,这是因为sonatype提供了一个服务,英文全称是Open Source Software Repository Hosting,翻译过来可以理解为开源软件资源库托管服务,简称为OSSRH。,开发者在把自己的开源项目打成jar包后,可以免费地将jar包托管在这里,这里先记住OSSRH这个简称,后面很多地方还会用到。,并且,maven中央仓库是不允许我们直接上传jar包到它上面的,因此我们只能将jar包发布到它指定的第三方maven仓库,然后这个仓库再将jar包同步到中央仓库。而sonatype的OSSRH仓库就是被认可的第三方仓库之一,所以我们选择把jar包先发布到这上面来。,铺垫了这么多,回过头来注册sonatype的账号,注册地址:,https://issues.sonatype.org/secure/Signup!default.jspa,注册比较简单,填一下邮箱、姓名、用户名和密码后,点击sign up就完成了。,
,登录完成后,语言可以选择中文,在system dashboard页面中,点击上方导航栏上的新建按钮,就可以创建一个issue,我看也有地方把这个issue称为工单。,要填的东西有点多,我们分两页看,先看第一页:,
,填完这些后,接着填下面的内容:,
,填写完成后,点新建按钮就完成了issue的提交。,创建完issue后等个几分钟,在它的活动日志区就会收到一条回复:,
,大意就是,如果想要继续流程的话,就按照下面两步走。,首先,先到你的github账户下面,按照它指定的名称,建这么一个临时仓库,证明你对这个github账号的所有权。于是我麻利的在github建好了这个仓库:,
,然后问题就来了,我们仔细看看回复中的第二步指南:,Edit this ticket and set Status to Open.,翻译过来就是,编辑这个票据并把状态设置为打开状态。,可就是这么朴实无华且枯燥的一句话,把我给难住了。在这条消息回复里,我把所有能点的地方点了一遍,也没找到这个所谓的ticket是什么东西。,当我的鼠标都要点烂了时,终于在别的老哥的提示下找到了答案,是要点击这个issue中的这个毫不起眼的Respond按钮啊!,
,说实话,在没有人告诉我这是个按钮之前,我一直以为这玩意就是一个破标签…,在我们把这个issue的状态切换回Open后,过个几分钟,如果没有其他问题,那么你就会收到下一条回复:,
,收到这条消息,就说明我们的groupId已经准备好可以使用了,并且之后可以用当前这个sonatype的账号发布snapshot和release版本的jar包到它的oss仓库中了。,接着看下面一段,根据构建配置,第一个组件可能会在成功部署(deploy)后自动发布(release)。如果发生这种情况,那么我们会收到一条消息,来确认我们的jar包被同步到了maven中央仓库。,既然人家都 congratulation 了,那咱们也开心点,到这里在sonatype上的操作就暂时告一段落了…,接下来,我们需要使用gpg生成秘钥,在后续包发布jar时会根据生成的秘钥进行校验,因为sonatype也需要对上传这一行为进行权健的校验,避免无意义或恶意上传文件的行为。,官网下载地址:,https://www.gnupg.org/download/,window版下载地址:,https://files.gpg4win.org/gpg4win-4.0.4.exe,我在下载了window版的安装文件后,一路无脑点击下一步就可以完成安装了。,在安装完成gpg后,在命令行下通过指令来生成一个秘钥:,在生成的过程中,首先会要求输入姓名和邮箱地址,在命令行窗口下填完这两个信息后,还会弹窗要求输入一个密码:,
,这个密码非常重要,一定要记住,后面在项目deploy的时候还会用到。填完后继续,秘钥就会成功生成并保存在本地目录下了:,
,在秘钥生成完后,我们需要把公钥上传到公共服务器供sonatype验证,可以通过下面的命令将公钥上传:,在公钥上传成功后,还可以通过--recv-keys来验证公钥:,
,虽然我这里一次就上传成功了,但是在看其他教程的过程中,也可能会出现失败的情况,这种情况可以尝试上传到其他的存放公钥的服务器:,端口的话都是11371,这些公钥服务器间会同步它们的数据给其他服务器,所以只要上传成功到其中一台就行。,接下来需要修改本地maven的配置,为了保险起见,我建议大家最好同时修改.m2和conf目录下的配置文件,否则有可能出现一些奇怪的问题。,首先在配置文件中添加一个server节点,配置sonatype的用户名及密码:,接着添加一个profie节点,配置gpg信息,这里就需要填入在生成gpg秘钥过程中,我们在弹窗中输入的密码了:,在修改完成后,可以在命令行窗口下,通过命令查看我们修改过的配置是否已经生效了:,如果显示的内容和配置文件中的一样,那么恭喜,后面就只还剩下亿点点工作了。,在maven环境修改完成后,我们还需要对项目的pom文件进行一些修改。,如果我们之前的代码中,groupId和sonatype上注册的不一致,那么需要修改项目的groupId改为一致。既然都要发布了,顺便也把version改为release版本吧。,添加distributionManagement信息,声明要打包到sonatype的maven仓库中去。,这里需要添加各种plugin插件,除了常用的maven-compiler和maven-deploy插件外,还需要下面几个关键插件:,使用到的全部插件详细配置如下,直接拷到项目中就可以使用:,至于在idea中,插件经常下载失败报红线的问题,个人测试可以先把它们加到dependencies中拉取下来,成功率能高不少…,添加license信息,使用Apache Licene 2.0 协议就行。,在这里填写一下项目的地址,把我们的github仓库地址贴上去就可以了。,补充开发者的个人信息,虽然估计也没什么人会联系我就是了。,在添加完这么多茫茫的信息后,我的pom文件成功的从70行变成了200多行……,到这里所有的基本工作就都做完了,下面执行激动人心的deploy命令!,命令执行结果:,
,果然是都到最后一步了,还是不能掉以轻心啊…,查了一下这个报错,大概就是SSL的问题,修改一下deploy命令的参数就行~,再次执行命令:,
,奇怪的错误又出现了…,这次的问题比较简单,就是项目中的pom中缺失了一些项目信息,修改pom文件,添加下面的信息:,再次尝试deploy,终于成功了!,
,登录https://s01.oss.sonatype.org/,看一眼oss仓库,我们的jar包已经上传成功了。,
,你以为到这里就结束了?恰恰相反,更加漫长的等待才刚刚开始…,在项目deploy成功后,回到sonatype,活动日志区很快就会收到一条新消息:,
,大意就是sonatype到中央仓库的同步是激活的,当我们成功发布组件后,通常30分钟左右就可以在 https://repo1.maven.org/maven2/上访问到了,但是更新到https://search.maven.org/可能需要4个小时。,按照这个提示,等半个小时再访问repo1.maven.org,经过一路搜索最后可以找到:,
,过四个小时再访问search.maven.org,果然在上面也可以查找到我的jar包了,sonatype诚不我欺…,
,讲道理的话,既然发布成功了,那我们就可以在项目中按照这个maven坐标拉取到jar包了,但是在项目中就是死活拉不下来…,于是我灵机一动,改为使用gradle:,你别说,居然真的成功了…,不过话说回来,在日常工作中,我还是更习惯用https://mvnrepository.com来查找maven依赖,至于什么时候能在上面搜到,我实测了一下,这个周期真是长的可怕。,在14号就上传jar包成功后,直到17号才能在mvnrepository上查找到…,
,那么,这次不那么顺利的踩坑之旅到这里就基本上结束了,总的来说,发布jar包到中央仓库真是个体力活。,在实际操作的过程中,有着数不完的坑,动不动一个点就可能卡住好几个小时,即便成功发布了,后续还有漫长的等待时间,总之就是非常心累…,对于那位在git上给我提issue的兄弟,我只有一句话想说…,本文在sonatype上提交的issue,以及提交的项目git地址我都放在下面了,大家如果有需求的话,可以参考一下~,sonatype的issue地址:https://issues.sonatype.org/browse/OSSRH-86180,项目的github地址:https://github.com/trunks2008/ulquiorra-cache,官方文档指南:https://central.sonatype.org/publish/publish-maven/,
© 版权声明
文章版权归作者所有,未经允许请勿转载。