前言:近期开源了Mybatis-Plus的Es版(ElasticSearch):Easy-Es,在框架正式上线Maven中央仓库的过程中,困难重重,经过多次努力,总算是成功上架了.
尽管目前网上不乏这类教程,但都已经过时了,现在Maven中央仓库的上传地址以及首次上传的规则都有更新(2021年官方换了新版),按前人那些老方式,不仅不能帮你上传成功,还会让你走很多弯路,误入歧途,所以特开此文,帮助有需要的同胞,少走弯路.
先来说一下首次上传的核心步骤,由于步骤中的过程相对较复杂,所以先抽象下基本思路,再展开讲解,避免大家看不懂.
抽象步骤:
- 注册账号
- 提交工单
- 人工审核及确认
- 上传SNAPSHOT版本
- 上传release版本
画了张流程图,过程大致如下:

目录
Sign up for Jira - Sonatype JIRA
密码要求比较高,大小写数字符号啥的都要有,所以务必要记住此密码,记不住的事先保存好,后面要经常用到账号和密码.
用上面创建的账号密码登录后,点击页面上方导航栏的Create按钮创建Issue:



通过以上两个步骤,你的工单就被创建完成了,接下来就耐心等待工作人员审核,由于美国和中国的时差,所以基本上大部分时候回复你都是23:00以后,注意留意你注册账号时填写的邮箱,回复内容会在邮箱里通知你.
在收到工作人员的确认邮件后,在邮件内容中他们通常会要求验证你填写的groupId中的域名或github账户是不是你本人的

创建好并确认无误后,你需要将此Iusse的状态置为Open,然后他们系统会自动去完成验证.
官方验证此域名/账户确实是你本人的之后,会再次发送邮件给你,告诉你你的仓库已经被激活了,此时你需要按照他们的要求,分别上传你项目的SNAPSHOT和release版本至指定地址:

如果步骤走不下去,请务必查阅官方文档,以官方文档为准,因为可能会有更新,我就是因为照着网上那些旧的教程走不下去了,最后靠官方文档才完美解决所有问题的.需要一定的英文文档阅读能力,如果英文不好可以先按我贴出来的步骤进行,或用谷歌翻译插件.
参考文档地址:OSSRH Guide - The Central Repository Documentation
流程:配置秘钥->配置settings.xml->配置pom.xml->上传
下载并安装GPG:
https://www.gnupg.org/download/index.html
根据你电脑当前系统选择合适的安装包下载并安装,安装按默认勾选的配置一路安装即可.
生成秘钥有两种方式,敲命令和UI界面两种,这里仅演示通过命令创建的方式
生成:
gpg --gen-key
Real name: 名字(E文)(我填了xingpengcheng)
Email address: 邮箱(自己的邮箱,我的是252645816@qq.com)
You selected this USER-ID:
"xxx[xxx@qq.com](mailto:xxx@qq.com)"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? o
之后往下,会让你输入用户名和邮箱,还有一个Passphase(输入两次,务必牢记,建议先找个地方记下来,后续要用到)
查看公钥
gpg --list-keys
查询结果:
C:/Users/Laohan/AppData/Roaming/gnupg/pubring.kbx
--------------------------------------------------
pub rsa2048 2020-06-06 [SC] [expires: 2022-06-06]
85B594371E0A38D70243B1E927EDC1D952E45334
uid [ultimate] xingpengcheng <252645816@qq.com>
sub rsa2048 2020-06-06 [E] [expires: 2022-06-06]
其中85B594371E0A38D70243B1E927EDC1D952E45334就是你的公钥key
发布公钥:
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --send-keys 85B594371E0A38D70243B1E927EDC1D952E45334
查询发布公钥是否成功
gpg --keyserver hkp://keyserver.ubuntu.com:11371 --recv-keys 85B594371E0A38D70243B1E927EDC1D952E45334
成功的话会有如下结果
gpg: key 27EDC1D952E45891: "xingpengcheng <252645816@qq.com>" not changed
gpg: Total number processed: 1
gpg: unchanged: 1
找到你IDEA自带或者你安装的Maven所在的目录:
File->settings->Build->Maven->MavenHomePath,进入此目录在conf文件夹下就可以看到settings.xml文件,如果没有的话可以自己新建一个.
然后在其中加入配置:
<servers>
<server>
<id>ossrh</id>
<username>252645816@qq.com(SonaType账号)</username>
<password>填你注册SonaType时填写的密码</password>
</server>
</servers>
<profiles>
<profile>
<id>ossrh</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--这里填你安装的GnuPG位置-->
<gpg.executable>C:/Program Files (x86)/GnuPG/bin/gpg.exe</gpg.executable>
<gpg.passphrase>填写你生成秘钥时输入的密码</gpg.passphrase>
<!--这里填你秘钥在磁盘上的位置,可通过上面步骤的 gpg --list-keys找到-->
<gpg.homedir>C:/Users/laohan/.gnupg</gpg.homedir>
</properties>
</profile>
</profiles>
以下配置信息已为最精简版,省略了无关内容,且加了注释,方便读者理解:
<!--gav信息-->
<groupId>io.github.xpc1024</groupId>
<artifactId>easy-es-parent</artifactId>
<!--需要特别注意,你上传的是SNAPSHOT仓库,所以此处版本号后缀必须带SNAPSHOT-->
<version>0.9.3-SNAPSHOT</version>
<!--项目信息...-->
<name>easy-es-parent</name>
<description>easy use for elastic search</description>
<url>https://github.com/xpc1024/easy-es</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>
<id>xpc</id>
<name>xpc</name>
<email>252645816@qq.com</email>
<roles>
<role>Project Manager</role>
<role>Architect</role>
</roles>
<timezone>+8</timezone>
</developer>
</developers>
<!--项目在github或其它托管平台的地址-->
<scm>
<connection>https://github.com/xpc1024/easy-es.git</connection>
<developerConnection>scm:git:ssh://git@github.com:xpc1024/easy-es.git</developerConnection>
<url>https://github.com/xpc1024/easy-es</url>
</scm>
<profiles>
<profile>
<!--注意,此id必须与setting.xml中指定的一致,不要自作聪明改它名字-->
<id>ossrh</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<!--发布到中央SNAPSHOT仓库插件-->
<plugins>
<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>
<!--生成源码插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!--生成API文档插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</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>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<distributionManagement>
<snapshotRepository>
<!--注意,此id必须与setting.xml中指定的一致-->
<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>
</profile>
</profiles>
完成上述配置,你已经基本上走完了80%的步骤了,此时,你可以通过Maven尝试打包一下你的项目:
clean,package

如果都成功了,那说明万事具备了,接下来你就可以上传了,没有成功的也别气馁,按照Maven打包时报的错误依次去解决即可,我当时在打包这步就出错了,因为没有按规范写方法上的注释,导致API文档打包失败.
clean,deploy 然后会弹出对话框让你输入生成gpg时填写的密码,然后弹出的确认对话框都敲回车,耐心等待上传,完成后你可以在控制台看到SUCCESS,至此,SNAPSHOT版本已被上传至中央SNAPSHOT仓库,可以在浏览器访问Nexus Repository Manager,登录后查看.
整体流程和上传SNAPSHOT版本一致,下面仅贴出差异点:
<!--将原来server标签和profile标签中的的ossrh替换为release-->
<id>release</id>
<!--修改GAV中的版本号,把SNAPSHOT后缀去掉-->
<version>0.9.3</version>
<!--将原来server标签和profile标签中的的ossrh替换为release-->
<id>release</id>
<!--移除此发布到中央SNAPSHOT仓库插件,并替换为分割线下面发布到中央release仓库的插件-->
<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>
<!--分割线-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<autoVersionSubmodules>true</autoVersionSubmodules>
<useReleaseProfile>false</useReleaseProfile>
<releaseProfiles>release</releaseProfiles>
<goals>deploy</goals>
</configuration>
</plugin>
clean,deploy 然后耐心等待成功,因为这是你第一次上传release包至中央仓库,所以他们平台的机器人会自动帮你同步(在他们回复你的ISSUE里也提到了这点,同步触发的前提是SNAPSHOT和release版本都已正确上传至中央仓库)
上传成功后,可在官网查看到:

在完成了SNAPSHOT和release版本上传之后,你会收到系统发来的邮件:

大致就是告诉你你已经成功完成了首次上传,你上传的项目会在30分钟以内同步到中央仓库中,届时你可以在Central Repository:中找和下载.
4小时内你可以在 Maven Central Repository Search中搜索到.
至此,恭喜你已首次完成将项目发布至中央仓库.
在之后,随着你项目的迭代,你可能需要发布新的版本至中央仓库,此时你可以跳过上传SNAPSHOT,直接上传release版本至中央仓库,由于非首次发布,他们的机器人也不再会帮助你自动同步了,此过程需要你手动触发,在上传完release包之后,打开官方页面,进入操作,具体流程如下图:

总体来看,要想把项目发布至中央仓库,还是比较复杂的,需要一定的英文阅读能力,需要有耐心,过程中肯定有各种各样的小问题需要你去解决,毕竟项目不一样,版本不一样,网上搜来的教程只能给你一定的参考,有些因为时间和版本原因不仅不能帮助你,还可能给你误导,所以我强烈建议,具体的流程还是参考官网文档比较靠谱,大致的流程可以参考本文或是网上其它教程,这样可以帮你少踩很多.
参考项目: Easy-Es
创作不易,希望可以收获你们的点赞,关注,评论三连,再次感谢您的来访!
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解