当前位置: 首页 > 科技观察

发布了一个jar包到中央仓库,心好累……

时间:2023-03-19 01:40:04 科技观察

大家好,我是Hydra。前几天上网的时候,看到一位老哥在git上给我提了个issue:没想到有一天我写的烂代码会被要求提中央仓库……然后又不是说我不想把jar包发布到中央仓库,但是我真的不想!不过既然铁汉们都发话了,我也得硬着头皮做吧?然后翻遍网上的文档,正式开始。Sonatype第一步,我们需要在sonatype上注册一个账号,提交一个issue。sonatype这个名字,突然说出来你可能反应不过来,但是看完下图你应该明白了:是的,如果你的公司已经搭建了自己的maven私服,那么sonatype公司一般都是用来开发的Nexus也是。这时候可能有朋友会问了,那我要上传中央仓库跟你的sonatype有什么关系呢?这是因为sonatype提供了一个服务。英文全称是OpenSourceSoftwareRepositoryHosting,可以翻译为OpenSourceSoftwareRepositoryHostingService,简称OSSRH。开发者将自己的开源项目打包成jar包后,就可以在这里免费托管jar包。这里,记住OSSRH的缩写,后面很多地方都会用到。而且maven中央仓库不允许我们直接上传jar包给它,所以我们只能把jar包发布到它指定的第三方maven仓库,然后由仓库将jar包同步到中央仓库.而sonatype的OSSRH仓库是认可的第三方仓库之一,所以我们选择先把jar包发布到它上面。1.注册了这么多,回去注册一个sonatype账号。注册地址:https://issues.sonatype.org/secure/Signup!default.jspa注册比较简单,填写邮箱、姓名、用户名和密码后,点击注册即可完成。2.提交问题登录后,您可以选择中文作为语言。在系统仪表盘页面,单击上方导航栏上的新建按钮创建问题。我认为有些地方将此问题称为工单。要填的东西很多,分两页吧。先看第一页:Project:选择CommunitySupport-OpenSourceProjectRepositoryHosting(OSSRH)问题类型:选择NewProjectSummary:ProjectSummary,这里填写项目名称即可,如果比较严谨,可以说明要发布一个新包给mavenDescription:非必填项,这里简单描述一下项目的功能完成这些之后,再填写以下内容:GroupId:项目的groupId。如果以com等开头,后面会验证你对域名的所有权。更简单的方法是直接以io.github.开头,加上你的github用户名,所以这里我填io.github.trunks2008ProjectURL:项目地址,没有.git结尾的SCMurl:也是项目地址,但最后一定要带上.gitUsername(s):不是必须的,这里是可以协助你提交项目的小伙伴的账号,前提是他也在这个JIRA注册了一个账号已经同步到Central:这里选择否,如果选择是,会关闭自动同步到中央仓库。填写完成后点击新建按钮完成问题的提交。3.创建临时库创建issue后稍等几分钟,你会在其活动日志区收到回复:大意是如果你想继续这个过程,请按照以下两个步骤操作。首先,先去你的github账号,根据它指定的名字建立这样一个临时仓库,以证明你对这个github账号的所有权。于是赶紧在github上建了这个仓库:那么问题来了,仔细看一下回复中的第二步指南:EditthisticketandsetStatustoOpen。翻译就是编辑这张ticket,设置状态为open状态。但就是这样朴实无华的一句话,难倒了我。在这条消息的回复中,我把所有可以订的地方都点了一遍,但是怎么也找不到这张所谓的ticket是什么。在我的鼠标快要烂掉的时候,在其他兄弟的提示下,终于找到了答案。就是点击本期那个不起眼的回复按钮!老实说,直到没有人告诉我这是一个按钮,我一直以为这个东西是一个坏掉的标签。。。我们把这个问题的状态切换回Open之后,几分钟后,如果没有其他问题,然后你就关闭去下一个回复:收到这条消息后,说明我们的groupId已经可以使用了,接下来我们就可以使用当前的sonatype账号发布快照和release版本jar包到它的oss仓库中了。然后看下一段,根据构建配置,部署成功(deploy)后第一个组件可能会自动发布。如果出现这种情况,那么我们会收到一个消息,确认我们的jar包已经同步到maven中央仓库了。既然大家都在祝贺,那我们也开心一下吧。这里对sonatype的操作暂时告一段落...gpgkey接下来我们需要使用gpg生成秘钥,在后续打包释放jar时根据生成的秘钥生成秘钥。关键是验证,因为sonatype还需要验证上传行为的正确性和健康性,避免无意义或恶意上传文件。1.安装gpg官网下载地址:https://www.gnupg.org/download/window版下载地址:https://files.gpg4win.org/gpg4win-4.0.4.exe我下载的是window版的安装下载文件后,一路想都没想就点击下一步完成安装。2.创建秘钥安装gpg后,通过命令行生成秘钥:gpg--gen-key生成过程中,首先会要求你输入姓名和邮箱地址,在命令行窗口填写完成这两个信息后,会弹窗要求输入密码:这个密码很重要,一定要记住,后面部署项目的时候会用到。填写完成后继续,秘钥就会成功生成并保存在本地目录:3.上传秘钥秘钥生成后,我们需要将公钥上传到公有服务器进行sonatype校验。公钥上传可以通过以下命令:gpg--keyserverhkp://keyserver.ubuntu.com:11371--send-keysXXXXX公钥上传成功后,也可以通过--验证公钥recv-keys:虽然我只是上传成功,但是在看其他教程的过程中,也有可能会出现失败的情况。在这种情况下,您可以尝试上传到其他存储公钥的服务器:pool.sks-keyservers.nekeys.openpgp.orgpgp.mit。edu端口为11371。这些公钥服务器会将自己的数据同步到其他服务器,所以只要上传成功到其中一台即可。Maven设置接下来需要修改本地的maven配置。为了保险起见,建议大家同时修改.m2和conf目录下的配置文件,否则可能会出现一些奇怪的问题。1、服务器首先在配置文件中添加一个server节点,配置sonatype的用户名和密码:ossrh${sonatypeusername}${sonatypepassword}2.profile然后添加一个profie节点来配置gpg信息。这里我们需要在生成gpg秘钥的过程中在弹窗中输入密码:ossrhgpg${弹窗输入的密码}ossrh修改完成后可以使用命令查看修改后的配置是否被占用effect:mvnhelp:effective-settings如果显示的内容与配置文件中的一致,那么恭喜你,只剩下几百万的工作点了。项目pom修改maven环境修改完成后,我们还需要对项目的pom文件进行一些修改。1.基本信息如果我们之前的代码中,groupId和sonatype上注册的不一致,那么我们需要修改项目的groupId使其保持一致。既然快要发布了,那我们顺便把版本改成release版吧。io.github.trunks2008ulquiorra-cache0.0.1-RELEASE2.distributionManagement添加distributionManagement信息,声明要打包到sonatype的maven仓库去。ossrhhttps://s01.oss.sonatype.org/content/repositories/snapshotsossrhhttps://s01.oss.sonatype.org/service/local/staging/deploy/maven2/3、插件需要在这里添加各种插件,除了常用的maven-compiler和maven-deploy插件外,还需要以下几个关键插件:nexus-staging-maven-plugin:sonatype插件,用于发布项目到中央仓库使用maven-source-plugin:生成javasource.jar文件maven-javadoc-plugin:生成javadoc文件maven-gpg-plugin:所有用于文件自动签名的插件详细配置如下,直接复制到项目中即可使用:org.apache.maven.pluginsmaven-compiler-plugin3.8.1${java.versione>${java.version}UTF-8org.sonatype.pluginsnexus-staging-maven-plugin1.6.7trueossrhhttps://s01.oss.sonatype.org/true<插件>org.apache.maven.pluginsmaven-source-plugin2.2.1attach-sourcesjar-no-forkorg.apache.maven.pluginsmaven-javadoc-plugin2.9.1privatetrueUTF-8UTF-8UTF-8-Xdoclint:nonejarorg.apache.maven.pluginsmaven-gpg-plugin1.5sign-artifacts验证signorg.apache.maven.pluginsmaven-deploy-plugin<版本>2.8.2至于idea中经常出现插件下载失败报红线的问题,可以添加到dependencies中拉下个人测试,成功率会高很多...4.添加license开源签名证书的信息,使用ApacheLicense2.0TheApacheSoftwareLicense,Version2.0http://www.apache.org/licenses/LICENSE-2.0.txtrepo5.仓库信息这里填写项目的地址,贴上我们的github仓库地址。https://github.com/trunks2008/ulquiorra-cachescm:git@github.com/trunks2008/ulquiorra-cache.gitscm:git@github.com/trunks2008/ulquiorra-cache.git6.Developerinformation补充开发者的个人信息,虽然估计没人会联系我。hydra765666922@qq.comhttps://github.com/trunks2008+8添加了这么多信息后,我的pom文件成功的从70行变成了200多行...发到这里之后,基本的工作就全部搞定了,下面执行excitingdeploy命令!mvncleandeploy-DskipTests命令的执行结果:果然是最后一步了,还是不能掉以轻心……看了这个报错,估计是SSL的问题。只需修改部署命令的参数即可~mvncleandeploy-DskipTests-Dmaven。wagon.http.ssl.insecure=true-Dmaven.wagon.http.ssl.allowall=true再次执行命令:奇怪的错误又出现了...这次的问题比较简单,就是少了一些项目信息在项目的pom中,修改pom文件,添加如下信息:ulquiorra-cache双层缓存工具https://github.com/trunks2008/ulquiorra-cache再次尝试部署,终于成功了!登录https://s01.oss.sonatype.org/,查看oss仓库,我们的jar包已经上传成功。你以为就在这里?相反,更长的等待才刚刚开始……漫长的等待项目部署成功后,返回sonatype,活动日志区很快就会收到一条新消息:大意是sonatype同步到central仓库激活后,当我们成功发布组件后,通常30分钟左右就可以在https://repo1.maven.org/maven2/上访问到,但是更新到https://search可能需要4个小时.maven.org/.按照这个提示,等半个小时再访问repo1.maven.org。一路寻找,终于找到了:四小时后访问search.maven.org。果然,你也可以在上面找到我的jar包。Sonatype真心的不要骗我...讲道理,既然发布成功了,我们在项目中可以根据maven坐标拉取jar包,但是在项目中拉不下来...于是灵机一动,改用gradle:dependencies{implementation("io.github.trunks2008:ulquiorra-cache:0.0.1-RELEASE")}别说,真的成功了。。。不过话说回来那,在日常工作中,我比较习惯使用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/